2010-09-27 2 views
4

У меня есть таблица с тремя разными идентификаторами. Я хочу различать столбцы 1 и 2 и суммировать значения столбца 3 (в одно поле - может быть, разделенная запятой строка). Сводное поле не должно «выглядеть красиво» (никаких проблем с: «4,3» (запятая в конце)). Я использую MS SQL Server 2008.SQL - Различают два столбца и суммарные значения на третьем

например:

ID1 ID2 ID3 
1 1 5 
1 1 8 
1 2 5 
1 2 8 
2 3 10 
2 3 11 
2 5 12 

SELECT ...?

Результат:

ID1 ID2 Summary 
1  1  5,8 
1  2  5,8 
2  3  10,11 
2  5  12 

ответ

5

Edit - удаляются конечные пробелы в третьей колонке

Поскольку вы сказали, суммированы поле не должно выглядеть красиво, попробуйте следующее:

SELECT M1.ID1, M1.ID2, 
(
    SELECT convert(nvarchar(50), ID3) + ',' 
    FROM MyTable M2 
    WHERE M1.ID1 = M2.ID1 AND M1.ID2 = M2.ID2 
    FOR XML PATH('') 
) M1 
FROM MyTable M1 
GROUP BY M1.ID1, M1.ID2 

Это предполагает ваше имя таблицы называется 'MyTable'. Этот запрос приводит к запятой в конце, но вы должны начать. Используя мою тестовую базу данных, это был выход:

ID1 ID2 M1 
1 1 5,8, 
1 2 5,8, 
2 3 10,11, 
2 5 12, 

Если вы хотите очистить вверх, это должно работать (хотя сам запрос некрасиво):

SELECT ID1, ID2, left(M1, len(M1) - 1) AS M1 
FROM 
(
    SELECT M1.ID1, M1.ID2, 
    (
     SELECT convert(nvarchar(50), ID3) + ',' 
     FROM MyTable M2 
     WHERE M1.ID1 = M2.ID1 AND M1.ID2 = M2.ID2 
     FOR XML PATH('') 
    ) M1 
    FROM MyTable M1 
    GROUP BY M1.ID1, M1.ID2 
) CleanedUp 
+0

+1 для группы по + пути XML, но вы должны смотреть на STUFF() для очистки эля tring, см. это: http: //stackoverflow.com/questions/1591325/concatenating-records-in-a-single-column-without-looping/1594824#1594824 –

+0

@KM - спасибо за указатель, оцените его – LittleBobbyTables

2

Там нет встроенных агрегатов в MSSQL, которые могут достичь этого. В этом link показаны несколько способов конкатенирования строковых значений на основе группы.

0

Я сделал это в Oracle, но я думаю, что вы можете сделать то же самое в SQL Server


select id1, id2, testfunction(id1, id2) 
from test 
group by id1, id2; 

функция тест определяются как


create or replace function testfunction(v_id1 in number, v_id2 in number) return varchar2 is 
    v_result varchar2(200); 
    v_id3 number;
cursor ids(p_id1 in number, p_id2 in number) is select id3 from test where id1 = p_id1 and id2 = p_id2; begin open ids(v_id1, v_id2); loop fetch ids into v_id3; exit when ids%notfound;
v_result := v_result || v_id3 || ','; end loop; close ids;
return(v_result); end testfunction;

Смежные вопросы