Преобразование строк в столбцы с использованием нескольких сводных в SQL - PullRequest
0 голосов
/ 26 сентября 2018

Я написал запрос для преобразования строк в столбцы, используя несколько сводных функций в отношении месяцев 4, 5 и 6. Мне удалось преобразовать строки в столбцы.Ниже приведен запрос:

(SELECT [team], 
Count_Of_OrderId,
    Count_Of_OId,
            Avg_a,
            [Count_of_u]  ,
    convert(varchar(max),[month_from_Date])+'_COID'  as 
month_from_Date_COAID, 
    convert(varchar(max),[month_from_Date]) + '_COID' as 
 month_from_Date_CODID,
    convert(varchar(max),[month_from_Date])+'_Avg_a'  as 
month_from_Date_Avg_a, 
    convert(varchar(max),[month_from_Date])+'_Count_of_u'  as 
month_from_Date_Count_of_u

FROM [MyTable]) AS S  
PIVOT  
(  
    MAX(Count_Of_OrderId,)
    FOR [month_from_Date_COAID] IN ([4_COID], [5_COID], [6_COID])  
)   AS PivotTable1

PIVOT  
(  
    MAX(Count_Of_OId)
    FOR [month_from_Date_CODID] IN ([4_COID], [5_COID], [6_COID])  
)   AS PivotTable2

PIVOT  
(  
    MAX(Avg_a)
    FOR [month_from_Date_Avg_a] IN ([4_Avg_a], [5_Avg_a], [6_Avg_a])  
)   AS PivotTable3
PIVOT  
(  
    MAX(Count_of_users)
    FOR [month_from_Date_Count_of_u] IN ([4_Count_of_u], [5_Count_of_u], 
[6_Count_of_u])  
)   AS PivotTable4

Итак, результат был:

+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+
|  Team  | COAID_4 | COAID_5 | COAID_6 | CODID_4 | CODID_5 | CODID_6 | Avg_a_4 | Avg_a_5 | Avg_a_6 | Count_of_u_4 | Count_of_u_5 | Count_of_u_6 |
+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+
| Team A | NULL    | NULL    | 17      | NULL    | NULL    | 15      | NULL    | NULL    | 1.13    | NULL         | NULL         | 7            |
| Team A | NULL    | 14      | NULL    | NULL    | 14      | NULL    | NULL    | 1       | NULL    | NULL         | 6            | NULL         |
| Team A | 9       | NULL    | NULL    | 7       | NULL    | NULL    | 1.29    | NULL    | NULL    | 5            | NULL         | NULL         |
| Team B | NULL    | NULL    | 12159   | NULL    | NULL    | 6482    | NULL    | NULL    | 1.88    | NULL         | NULL         | 40           |
| Team B | NULL    | 14287   | NULL    | NULL    | 6525    | NULL    | NULL    | 2.19    | NULL    | NULL         | 39           | NULL         |
| Team B | 15822   | NULL    | NULL    | 7117    | NULL    | NULL    | 2.22    | NULL    | NULL    | 40           | NULL         | NULL         |
| Team C | NULL    | NULL    | 293     | NULL    | NULL    | 174     | NULL    | NULL    | 1.68    | NULL         | NULL         | 6            |
| Team C | NULL    | 318     | NULL    | NULL    | 221     | NULL    | NULL    | 1.44    | NULL    | NULL         | 6            | NULL         |
| Team C | 312     | NULL    | NULL    | 183     | NULL    | NULL    | 1.7     | NULL    | NULL    | 6            | NULL         | NULL         |
+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+

Здесь команда была разделена на 3 строки для 4-го, 5-го и 6-го месяца.Я хотел бы получить o / p как:

+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+
|  Team  | COAID_4 | COAID_5 | COAID_6 | CODID_4 | CODID_5 | CODID_6 | Avg_a_4 | Avg_a_5 | Avg_a_6 | Count_of_u_4 | Count_of_u_5 | Count_of_u_6 |
+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+
| Team A |       9 |      14 |      17 |       7 |      14 |      15 |    1.29 |       1 |    1.13 |            5 |            6 |            7 |
| Team B |   15822 |   14287 |   12159 |    7117 |    6525 |    6482 |    2.22 |    2.19 |    1.88 |           40 |           39 |           40 |
| Team C |     312 |     318 |     293 |     183 |     221 |     174 |     1.7 |    1.44 |    1.68 |            6 |            6 |            6 |
+--------+---------+---------+---------+---------+---------+---------+---------+---------+---------+--------------+--------------+--------------+

Я не уверен, в чем ошибка в моем коде.

1 Ответ

0 голосов
/ 26 сентября 2018

Простой способ, которым вы можете использовать MAX

SELECT Team,
       MAX(COAID_4),
       MAX(COAID_5),
       MAX(COAID_6),
       ....
FROM T
GROUP BY Team

T - ваш текущий результат запроса SQL.

Но я думаю, что вы ищете условную агрегатную функцию чтобы сделать опору.

SELECT 
      [team], 
      MAX(CASE WHEN month_from_Date = 4 THEN Count_Of_OrderId END) '4_COID',
      MAX(CASE WHEN month_from_Date = 5 THEN Count_Of_OrderId END) '5_COID',
      MAX(CASE WHEN month_from_Date = 6 THEN Count_Of_OrderId END) '6_COID',
      MAX(CASE WHEN month_from_Date = 4 THEN Count_Of_OId END) '4_COID',
      MAX(CASE WHEN month_from_Date = 5 THEN Count_Of_OId END) '5_COID',
      MAX(CASE WHEN month_from_Date = 6 THEN Count_Of_OId END) '6_COID',
      MAX(CASE WHEN month_from_Date = 4 THEN Avg_a END) '4_Avg_a',
      MAX(CASE WHEN month_from_Date = 5 THEN Avg_a END) '5_Avg_a',
      MAX(CASE WHEN month_from_Date = 6 THEN Avg_a END) '6_Avg_a',
      MAX(CASE WHEN month_from_Date = 4 THEN Count_of_users END) '4_Count_of_u',
      MAX(CASE WHEN month_from_Date = 5 THEN Count_of_users END) '5_Count_of_u',
      MAX(CASE WHEN month_from_Date = 6 THEN Count_of_users END) '6_Count_of_u'
FROM [MyTable]
GROUP BY [team]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...