SQL Server 2008 R2-具有(移动)日期的动态数据透视/取消透视

弗兰克·扎帕(Frank Zappa)

我之前曾发布过一个关键问题,并且已经回答了。但是,这种特殊情况需要日期,因为标题和日期将在每次生成数据透视表时更改(并且未知)。我相信我需要基于一些示例进行动态枢轴/取消枢轴,但是我无法弄清楚语法。

表格如下:

CREATE TABLE [dbo].[PhaseFlowChart](
    [pfckey] [int] NULL,
    [hourlykey] [bigint] NULL,
    [daykey] [bigint] NULL,
    [weekkey] [int] NULL,
    [monthkey] [int] NULL,
    [bbkey] [int] NULL,
    [Day] [varchar](100) NULL,
    [Date] [varchar](100) NULL,
    [Bull Bear Gap] [varchar](100) NULL,
    [Monthly] [varchar](100) NULL,
    [Weekly] [varchar](100) NULL,
    [Daily] [varchar](100) NULL,
    [Hour 1] [varchar](100) NULL,
    [Hour 2] [varchar](100) NULL,
    [Hour 3] [varchar](100) NULL,
    [Hour 4] [varchar](100) NULL,
    [Hour 5] [varchar](100) NULL,
    [Hour 6] [varchar](100) NULL,
    [Hour 7] [varchar](100) NULL
) ON [PRIMARY]

我不需要输出中的任何“关键”列。因此,这是表格上的一个简单选择:

select [DAY],[Date],[Bull Bear Gap],[Monthly],[Weekly],[Daily],[Hour 1],[Hour 2],[Hour 3],[Hour 4],[Hour 5],[Hour 6],[Hour 7] 
from PhaseFlowChart
order by pfckey asc

这是上面的输出:

在此处输入图片说明

我希望输出(动态枢轴/不枢轴?)看起来像这样(再次,每次生成的日期都将是不同的,这是每天的):

在此处输入图片说明

最终,我在网络上找到了该sql,但是经过几天的语法操作后,我仍然想不出如何移植它以满足我的需要。

CREATE TABLE #yt
    ([ID] int, [expense] int, [revenue] int, [date] datetime)
;

INSERT INTO #yt
    ([ID], [expense], [revenue], [date])
VALUES
    (1, 43, 45, '2012-12-31 00:00:00'),
    (2, 32, 32, '2013-01-01 00:00:00'),
    (3, 64, 56, '2013-01-31 00:00:00'),
    (4, 31, 32, '2013-03-03 00:00:00')

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

select @cols = STUFF((SELECT ',' + QUOTENAME(c.col+'_'+convert(varchar(10), #yt.date, 110)) 
                    from #yt
                    cross apply
                    (
                      select 'expense' col union all
                      select 'revenue'
                    ) c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id,' + @cols + ' 
            from
            (
              select id, 
                col+''_''+convert(varchar(10), date, 110) new_col, 
                value
              from #yt
              unpivot
              (
                value
                for col in (expense, revenue)
              ) un
            ) src
            pivot 
            (
                sum(value)
                for new_col in (' + @cols + ')
            ) p '

execute(@query);

任何/所有帮助将不胜感激。

TI

您首先需要进入UNPIVOT我们的专栏,然后再使用DENSE_RANK()它为您提供一些帮助。将此结果放入临时表中,以便获得逗号分隔的DESNSE_RANK列表然后创建一个UNIONso,使其DayDate未透视图属于同一列。可以将其放在全局临时表中以用于动态SQL。创建一个变量,该变量将存储列列表,并构建动态SQL并执行它。

一个完整的例子(显然不要丢PhaseFlowChart表)

-- pre-cleanup
IF OBJECT_ID('[dbo].[PhaseFlowChart]') IS NOT NULL
    DROP TABLE [dbo].[PhaseFlowChart]
GO

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
    DROP TABLE #tmp
GO

IF OBJECT_ID('tempdb..##tmp') IS NOT NULL
    DROP TABLE ##tmp
GO

-- setup table and data
CREATE TABLE [dbo].[PhaseFlowChart](
    [pfckey] [int] NULL,
    [hourlykey] [bigint] NULL,
    [daykey] [bigint] NULL,
    [weekkey] [int] NULL,
    [monthkey] [int] NULL,
    [bbkey] [int] NULL,
    [Day] [varchar](100) NULL,
    [Date] [varchar](100) NULL,
    [Bull Bear Gap] [varchar](100) NULL,
    [Monthly] [varchar](100) NULL,
    [Weekly] [varchar](100) NULL,
    [Daily] [varchar](100) NULL,
    [Hour 1] [varchar](100) NULL,
    [Hour 2] [varchar](100) NULL,
    [Hour 3] [varchar](100) NULL,
    [Hour 4] [varchar](100) NULL,
    [Hour 5] [varchar](100) NULL,
    [Hour 6] [varchar](100) NULL,
    [Hour 7] [varchar](100) NULL
) ON [PRIMARY]

INSERT INTO [dbo].PhaseFlowChart 
    ([Day], [Date], [Bull Bear Gap], Monthly, Weekly, Daily, 
        [Hour 1], [Hour 2], [Hour 3], [Hour 4], [Hour 5], [Hour 6], [Hour 7])
VALUES
('MON', '20130101', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1'),
('TUE', '20130102', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2'),
('WED', '20130103', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3'),
('THU', '20130104', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4'),
('FRI', '20130105', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5'),
('SAT', '20130106', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6'),
('SUN', '20130107', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7')
GO

-- unpivot the columns into 'categories'
SELECT [Day], [Date], [Value], [Category], 
    DENSE_RANK() OVER (ORDER BY CAST([Date] AS DATE)) dr 
INTO #tmp
FROM PhaseFlowChart pfc
UNPIVOT (
    Value FOR Category IN ([Bull Bear Gap], Monthly, Weekly, Daily, 
                            [Hour 1], [Hour 2], [Hour 3], [Hour 4], 
                                [Hour 5], [Hour 6], [Hour 7])

) upiv

-- create a global temp table for use later
SELECT *
INTO ##tmp
FROM (
      -- union data into single category column
    SELECT 'Day' Category, [Day] Value, dr, 1 o FROM #tmp
    UNION ALL
    SELECT 'Date' Category, [Date] Value, dr, 2 o FROM #tmp
    UNION ALL
    SELECT [Category], Value, dr, 3 o FROM #tmp
) t

-- get a comma seperated list of columns for the PIVOT
DECLARE @cols VARCHAR(MAX) = 
STUFF(CAST((SELECT ',' + QUOTENAME(dr)
       FROM (
           SELECT DISTINCT dr
           FROM #tmp
       ) t
       ORDER BY dr
       FOR XML PATH(''), TYPE
      ) AS VARCHAR(MAX)),1,1,'')

-- create and execute the sql
DECLARE @sql VARCHAR(MAX) = '
    SELECT Category, ' + @cols + '
    FROM ##tmp
    PIVOT (
        MAX([Value])
        FOR dr IN (' + @cols + ')
    ) piv   
      ORDER BY o, CASE Category 
                    WHEN ''Daily'' THEN 4
                    WHEN ''Weekly'' THEN 3
                    WHEN ''Monthly'' THEN 2
                    WHEN ''Bull Bear Gap'' THEN 1
                    ELSE 5 END, Category
'

EXEC(@sql)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用SQL Server 2008 R2从Datetime获取日期名称

来自分类Dev

GETDATE()函数SQL Server 2008 R2与Windows Server时间有所不同

来自分类Dev

将数据库还原到时间点SQL SERVER 2008 R2

来自分类Dev

SQL Server 2008 R2-具有(移动)日期的动态数据透视/取消透视

来自分类Dev

数据库引擎恢复句柄失败的SQl Server 2008 R2

来自分类Dev

SQL Server 2008 R2无法连接到Management Studio中的本地数据库

来自分类Dev

使用SQL Server 2008 R2在数据透视表查询中的聚合函数

来自分类Dev

如何使用Power Shell检查SQL Server 2008 R2数据库是否存在

来自分类Dev

SQL Server 2008 R2:具有where和Have子句的数据透视表的动态查询

来自分类Dev

SQL Server 2008 R2数据类型转换错误

来自分类Dev

SQL Server 2008 R2:将日期日期显示为以逗号分隔的列

来自分类Dev

SQL Server 2008 R2:使用存储为BLOB(图像数据类型)的XML

来自分类Dev

我想为SQL Server 2008 R2数据库创建密码或登录

来自分类Dev

SQL Server 2008 R2上次数据库用户的日期和时间

来自分类Dev

日期类型为空的SQL Server 2016 Convert函数与SQL Server 2008 R2不同

来自分类Dev

从2008 R2创建SQL Server 2008备份

来自分类Dev

将数据库还原到时间点SQL SERVER 2008 R2

来自分类Dev

SQL Server 2008 R2中的困难还原数据库

来自分类Dev

SQL Server 2008 R2-数据透视用法?

来自分类Dev

如何使用Powershell 3.0在SQL Server 2008 R2中填写日期?

来自分类Dev

SQL Server 2008 R2无法连接到Management Studio中的本地数据库

来自分类Dev

SQL Server 2008 R2:数据透视表

来自分类Dev

SQL Server 2008 R2:动态数据透视表查询性能

来自分类Dev

具有位类型的SQL Server 2008 R2动态数据透视查询

来自分类Dev

使用SQL Server 2008 R2进行数据透视表查询

来自分类Dev

在Windows Server 2008 R2上运行带有SQL Server 6.5的ASP站点

来自分类Dev

SQL Server 2008 R2:准备动态临时VIEW

来自分类Dev

SQL Server 2008 R2:带计数的数据透视表

来自分类Dev

SQL Server 2008 R2:使用多个 CTE 获取日期明智的记录

Related 相关文章

  1. 1

    使用SQL Server 2008 R2从Datetime获取日期名称

  2. 2

    GETDATE()函数SQL Server 2008 R2与Windows Server时间有所不同

  3. 3

    将数据库还原到时间点SQL SERVER 2008 R2

  4. 4

    SQL Server 2008 R2-具有(移动)日期的动态数据透视/取消透视

  5. 5

    数据库引擎恢复句柄失败的SQl Server 2008 R2

  6. 6

    SQL Server 2008 R2无法连接到Management Studio中的本地数据库

  7. 7

    使用SQL Server 2008 R2在数据透视表查询中的聚合函数

  8. 8

    如何使用Power Shell检查SQL Server 2008 R2数据库是否存在

  9. 9

    SQL Server 2008 R2:具有where和Have子句的数据透视表的动态查询

  10. 10

    SQL Server 2008 R2数据类型转换错误

  11. 11

    SQL Server 2008 R2:将日期日期显示为以逗号分隔的列

  12. 12

    SQL Server 2008 R2:使用存储为BLOB(图像数据类型)的XML

  13. 13

    我想为SQL Server 2008 R2数据库创建密码或登录

  14. 14

    SQL Server 2008 R2上次数据库用户的日期和时间

  15. 15

    日期类型为空的SQL Server 2016 Convert函数与SQL Server 2008 R2不同

  16. 16

    从2008 R2创建SQL Server 2008备份

  17. 17

    将数据库还原到时间点SQL SERVER 2008 R2

  18. 18

    SQL Server 2008 R2中的困难还原数据库

  19. 19

    SQL Server 2008 R2-数据透视用法?

  20. 20

    如何使用Powershell 3.0在SQL Server 2008 R2中填写日期?

  21. 21

    SQL Server 2008 R2无法连接到Management Studio中的本地数据库

  22. 22

    SQL Server 2008 R2:数据透视表

  23. 23

    SQL Server 2008 R2:动态数据透视表查询性能

  24. 24

    具有位类型的SQL Server 2008 R2动态数据透视查询

  25. 25

    使用SQL Server 2008 R2进行数据透视表查询

  26. 26

    在Windows Server 2008 R2上运行带有SQL Server 6.5的ASP站点

  27. 27

    SQL Server 2008 R2:准备动态临时VIEW

  28. 28

    SQL Server 2008 R2:带计数的数据透视表

  29. 29

    SQL Server 2008 R2:使用多个 CTE 获取日期明智的记录

热门标签

归档