SQL метри c строк в столбцах даты- - PullRequest
0 голосов
/ 05 апреля 2020

Предположим, у меня есть следующая таблица:

Client  ContainerID   Year  Month   NumberOfViews
bar     116025        2019    1         2
dandy   2753          2020    1         3
dandy   2753          2020    2         2
dandy   4247          2020    1         1
demo    20037         2019    1         1

Я хочу преобразовать ее в следующую таблицу:

Client  ContainerID   Jan-2019  Jan-2020 Feb-2020   
bar     116025        2         0        0
dandy   2753          0         3        2
dandy   4247          0         1        0
demo    20037         1         0        0

значение: строки ячеек года + месяца превращаются в столбцы, а значение для NumberOfViews указывается в правом столбце даты.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Я думаю, вам нужен Dynami c PIVOT, так как месяц-год не является c. Пожалуйста, попробуйте это ниже logi c -

Пожалуйста, используйте свое оригинальное имя таблицы, где бы вы ни находили "your_table" в скрипте.

DECLARE @cols AS NVARCHAR(MAX),
@sqlCommand  AS NVARCHAR(MAX);


SELECT  @cols =
STUFF((SELECT   ( '],[' +  A.YM)
        FROM 
        (
            SELECT 
            CASE Month
                WHEN 1 THEN 'Jan-' WHEN 2 THEN 'Feb-' WHEN 3 THEN 'Mar-'
                WHEN 4 THEN 'Apr-' WHEN 5 THEN 'May-' WHEN 6 THEN 'Hun-'
                WHEN 7 THEN 'Jul-' WHEN 8 THEN 'Aug-' WHEN 9 THEN 'Sep-'
                WHEN 10 THEN 'Oct-' WHEN 11 THEN 'Nov-' WHEN 12 THEN 'Dec-'
            END
            + CAST(Year AS VARCHAR) YM
            FROM your_table
        ) A
        ORDER BY A.YM 
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)')
    ,1,1,'')+']'
FROM your_table

SET @sqlCommand= 
N'SELECT Client,ContainerID,'+SUBSTRING(@cols,2,LEN(@cols))+'
FROM 
(
    SELECT Client,ContainerID,YM,NumberOfViews 
    FROM 
    ( 
        SELECT Client,ContainerID,NumberOfViews,
        CASE Month
            WHEN 1 THEN ''Jan-'' WHEN 2 THEN ''Feb-'' WHEN 3 THEN ''Mar-''
            WHEN 4 THEN ''Apr-'' WHEN 5 THEN ''May-'' WHEN 6 THEN ''Hun-''
            WHEN 7 THEN ''Jul-'' WHEN 8 THEN ''Aug-'' WHEN 9 THEN ''Sep-''
            WHEN 10 THEN ''Oct-'' WHEN 11 THEN ''Nov-'' WHEN 12 THEN ''Dec-''
        END
        + CAST(Year AS VARCHAR) YM
        FROM your_table
    )A
) AS P
PIVOT
(
    SUM(NumberOfViews)
    FOR YM IN('+SUBSTRING(@cols,2,LEN(@cols))+')
) PVT'

--PRINT @sqlCommand
EXEC (@sqlCommand)
1 голос
/ 05 апреля 2020

Вот вам go.

Замените имя таблицы:

WITH cte AS(
SELECT Client
      ,ContainerId
      ,NumberOfViews
      ,FORMAT(CAST(CAST([Year] AS CHAR(4)) + '-' + CAST([Month] AS CHAR(2)) + '-01' AS DATE), 'MMM-yyyy') AS [DateCol] 
  FROM dbo.Test)

SELECT Client
      ,ContainerId
      ,ISNULL([Jan-2019], 0) AS [Jan-2019]
      ,ISNULL([Jan-2020], 0) AS [Jan-2020]
      ,ISNULL([Feb-2020], 0) AS [Feb-2020]
  FROM cte
 PIVOT  
(  
    SUM(NumberOfViews)  
    FOR DateCol IN ([Jan-2019], [Jan-2020], [Feb-2020])  
) AS PivotTable;    
...