SQL Server: объединить два значения в одной строке

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

У меня есть следующее объединение всех результатов

 ID  Name     Date         Team         Total#1     Total#2
1   Test_1   4/25/2011    Team_1         110          0
1   Test_1   4/25/2011    Team_2         20           0
1   Test_1   4/25/2011    Team_3         170          0
1   Test_1   4/25/2011    Team_1         0            151
1   Test_1   4/25/2011    Team_3         0            98
  

Я хочу объединить результаты для каждой команды. Есть несколько повторяющихся названий команд с разными итоговыми значениями, а есть несколько уникальных названий команд с одним общим значением.

 ID  Name     Date         Team         Total#1     Total#2
1   Test_1   4/25/2011    Team_1         110          151
1   Test_1   4/25/2011    Team_2         20           0
1   Test_1   4/25/2011    Team_3         170          98
  

Есть мысли?

Комментарии:

1. объединить результаты для каждой team,id,name,date комбинации или для каждой команды? Если последнее, то для чего должно отображаться id,name,date в случае, если в сгруппированных строках разные значения?

Ответ №1:

 SELECT Id, Name, Date, Team, SUM([Total#1]) [Total#1], SUM([Total#2]) [Total#2]
FROM YourUnionResult
GROUP BY Id, Name, Date, Team
  

Ответ №2:

Просто используйте агрегатные функции и GROUP BY :

 SELECT ID, Name, Date, Team, SUM(Total#1) as Total1, Sum(Total#2) as Total2
FROM Mytable
WHERE ...
GROUP BY ID, Name, Date, Team
  

Ответ №3:

разве это не работает?

 select id,name,date,team,sum(Total#1) as Total#1,sum(Total#2) as Total#2
from Your table
group by id,name,date,team
  

Ответ №4:

Создайте select... union select... подзапрос, и «внешний» запрос сопоставит его с group by.

Ответ №5:

Предполагая, что по какой-то причине стандартная группировка не работает, вы могли бы сделать это

 SELECT t1.id, 
       t1.name, 
       t1.DATE, 
       t1.team, 
       t1.total_1, 
       t2.total_2 
FROM   (SELECT id, 
               name, 
               DATE, 
               team, 
               somecomplicatedcalculation total_1 
        FROM   your table) t1 
       LEFT JOIN (SELECT id, 
                         name, 
                         DATE, 
                         team, 
                         somecomplicatedcalculation total_2 
                  FROM   your table) t2 
         ON t1.id = t2.id
            and t1.team = t2.team
  

Вы также могли бы сделать то же самое с CTE

 WITH t1 
     AS (SELECT id, 
                name, 
                DATE, 
                team, 
                somecomplicatedcalculation total_1 
         FROM   your table), 
     t2 
     AS (SELECT id, 
                name, 
                DATE, 
                team, 
                somecomplicatedcalculation total_2 
         FROM   your table) 
SELECT * 
FROM   t1 
       INNER JOIN t2 
         ON t1.id = t2.id 
            and t1.team = t2.team
  

ИЛИ группировка при объединении будет работать для

 SELECT id, 
       name, 
       DATE, 
       team, 
       SUM(total_1), 
       SUM(total_2) 
FROM   (SELECT id, 
               name, 
               DATE, 
               team, 
               somecomplicatedcalculation total_1, 
               0                          AS total_2 
        FROM   yourtable 
        UNION ALL 
        SELECT id, 
               name, 
               DATE, 
               team, 
               0                          AS total_1, 
               somecomplicatedcalculation total_2 
        FROM   yourtable) total 
GROUP BY id, 
       name, 
       DATE, 
       team