SQL - Различают по двум столбцам и суммируют по третьим - PullRequest
4 голосов
/ 27 сентября 2010

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

например:

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

ВЫБРАТЬ ...?

Результат:

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

Ответы [ 3 ]

5 голосов
/ 27 сентября 2010

Редактировать - удаленные конечные пробелы в третьем столбце

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

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
2 голосов
/ 27 сентября 2010

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

0 голосов
/ 27 сентября 2010

Я сделал это в 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;<br/>
  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;<br/>
     v_result := v_result || v_id3 || ',';
   end loop;
   close ids;<br/>
   return(v_result);
end testfunction;
...