【问题标题】:rename pivot columns using dateadd for column name使用 dateadd 作为列名重命名数据透视列
【发布时间】:2018-07-13 19:56:52
【问题描述】:

我有一个带有月份偏移量的表。我想以此列为中心,但对于输出,我想使用偏移量计算月份名称/年份。

我需要能够在没有动态 SQL 的情况下做到这一点,而我必须 execute

在生产中,我的MyMonthOffset 可能会增加到 24(或更多)。我知道在PIVOT FOR 部分我必须像FOR MyMonthOffset IN ("0", "1", "2", "3", ... "24") 一样列出所有这些。

输入表

CREATE TABLE dbo.MyData
(
      MyName        [NVARCHAR](10) NOT NULL
    , MyMonthOffset [INT]          NOT NULL
    , MyCount       [INT]          NOT NULL
) ON [DEFAULT];

INSERT INTO dbo.MyData
VALUES
    ('four', 0, 6),
    ('four', 1, 8),
    ('four', 1, 4),
    ('four', 2, 8),
    ('four', 2, 5),
    ('four', 2, 5),
    ('four', 3, 4),
    ('four', 3, 8),
    ('four', 3, 8),
    ('one', 0, 3),
    ('one', 0, 5),
    ('one', 0, 4),
    ('one', 0, 2),
    ('one', 1, 4),
    ('one', 2, 1),
    ('one', 2, 1),
    ('one', 3, 9),
    ('three', 1, 1),
    ('three', 3, 6),
    ('three', 3, 9),
    ('three', 3, 7),
    ('two', 0, 10),
    ('two', 0, 1),
    ('two', 1, 7),
    ('two', 3, 7)

+--------+---------------+---------+
| MYNAME | MYMONTHOFFSET | MYCOUNT |
+--------+---------------+---------+
| four   | 0             | 6       |
| four   | 1             | 8       |
| four   | 1             | 4       |
| four   | 2             | 8       |
| four   | 2             | 5       |
| four   | 2             | 5       |
| four   | 3             | 4       |
| four   | 3             | 8       |
| four   | 3             | 8       |
| one    | 0             | 3       |
| one    | 0             | 5       |
| one    | 0             | 4       |
| one    | 0             | 2       |
| one    | 1             | 4       |
| one    | 2             | 1       |
| one    | 2             | 1       |
| one    | 3             | 9       |
| three  | 1             | 1       |
| three  | 3             | 6       |
| three  | 3             | 9       |
| three  | 3             | 7       |
| two    | 0             | 10      |
| two    | 0             | 1       |
| two    | 1             | 7       |
| two    | 3             | 7       |
+--------+---------------+---------+

当前枢轴输出

SELECT
    *
FROM
(
    SELECT
          MyName
        , MyMonthOffset
        , MyCount
    FROM dbo.MyData
) SourceTable
PIVOT
(
    SUM(MyCount)
    FOR MyMonthOffset IN ("0", "1", "2", "3")
) PivotTable

+--------+------+----+------+----+
| MYNAME |  0   | 1  |  2   | 3  |
+--------+------+----+------+----+
| four   | 6    | 12 | 18   | 20 |
| one    | 14   | 4  | 2    | 9  |
| three  | NULL | 1  | NULL | 22 |
| two    | 11   | 7  | NULL | 7  |
+--------+------+----+------+----+

预期/期望的输出

+--------+--------+--------+--------+--------+
| MYNAME | JUL 18 | AUG 18 | SEP 18 | OCT 18 |
+--------+--------+--------+--------+--------+
| four   | 6      | 12     | 18     | 20     |
| one    | 14     | 4      | 2      | 9      |
| three  | NULL   | 1      | NULL   | 22     |
| two    | 11     | 7      | NULL   | 7      |
+--------+--------+--------+--------+--------+

【问题讨论】:

  • 像这样命名列需要动态 SQL。

标签: sql sql-server pivot sql-server-2014


【解决方案1】:

你需要使用动态轴

声明两个变量,一个用于透视列,另一个用于别名列名。

DECLARE @cols AS NVARCHAR(MAX),
        @Pivotcols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);



SET @cols = STUFF((SELECT DISTINCT ',"'  + CAST(MyMonthOffset AS VARCHAR(5)) +'"'
            FROM MyData 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @Pivotcols = STUFF((SELECT DISTINCT ',[' + CAST(MyMonthOffset AS VARCHAR(5)) + '] as ''' + FORMAT(DATEADD(mm,MyMonthOffset,GETDATE()),'MMM yy') + ''''
            FROM MyData 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')   


set @query = 'SELECT MyName, '+  @Pivotcols + '  
FROM
(
    SELECT
          MyName
        , MyMonthOffset
        , MyCount
    FROM dbo.MyData
) SourceTable
PIVOT
(
    SUM(MyCount)
    FOR MyMonthOffset IN ('+@cols+')
) PivotTable'

execute(@query)

sqlfiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-10-10
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多