Объединить две таблицы для одного вывода с разделением по разным столбцам

#sql #sql-server #sql-server-2014

#sql #sql-сервер #sql-server-2014

Вопрос:

Пример исходных данных:

  Project   | Status    |   Emp1     |   Emp2     |   Emp3     |
 --------------------------------------------------------------
 Project 1 |   Active  |     10     |     10     |     20     |
 Project 2 |   Closed  |     10     |     20     |     10     |
 Project 1 |   Closed  |     20     |     10     |     20     |
 Project 1 |   Active  |     20     |     20     |     10     |
 Project 2 |   Active  |     20     |     10     |     20     |
  

Используя SQL Server 2014, у меня есть 2 запроса, которые мне нужно объединить, чтобы получить 1 таблицу, сгруппированную по «Проекту» с новыми столбцами «Emp» на основе статуса.

  SELECT [Project],
          SUM([Emp1]) as [Emp1_Act],                    
          SUM([Emp2]) as [Emp2_Act],
          SUM([Emp2]) as [Emp3_Act],
        from t where status = 'Active' 
 SELECT [Project],
          SUM([Emp1]) as [Emp1_Clo],                    
          SUM([Emp2]) as [Emp2_Clo],
          SUM([Emp2]) as [Emp3_Clo],
        from t where status = 'Closed'
  

Запрошенные данные:

    Project   | Emp1_Act | Emp2_Act | Emp3_Act | Emp1_Clo | Emp2_Clo | Emp3_Clo |
   -----------------------------------------------------------------------------
   Project 1 |    30    |    30    |    30    |    10    |    20    |    10    |
   Project 2 |    20    |    10    |    20    |    20    |    10    |    20    |
  

Ответ №1:

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

 SELECT Project,
       SUM(CASE WHEN Status = 'Active' THEN Emp1 ELSE 0 END) AS Emp1_Act,
       SUM(CASE WHEN Status = 'Active' THEN Emp2 ELSE 0 END) AS Emp2_Act,
       SUM(CASE WHEN Status = 'Active' THEN Emp3 ELSE 0 END) AS Emp3_Act,
       SUM(CASE WHEN Status = 'Closed' THEN Emp1 ELSE 0 END) AS Emp1_Clo,
       SUM(CASE WHEN Status = 'Closed' THEN Emp2 ELSE 0 END) AS Emp2_Clo,
       SUM(CASE WHEN Status = 'Closed' THEN Emp3 ELSE 0 END) AS Emp3_Clo
FROM t
GROUP BY Project