【问题标题】:How to do a PIVOT by day cycle in 31 days in month in SQL Server如何在 SQL Server 中以每月 31 天为周期进行 PIVOT
【发布时间】:2015-11-06 06:02:29
【问题描述】:

我有这张桌子:

CREATE TABLE [dbo].[tblProducts]
(
    [CATEGORY_ID] [nvarchar](50) NULL,
    [PRODUCT] [nvarchar](50) NULL,
    [PRODUCTION_DATE] [datetime] NULL
) ON [PRIMARY]

我需要显示当月每一天的总产品

应该调整天数

CATE   1 2 3 4 5 6 7.....30 (or 31)  -->days of month
CATE1  1 5                           --> count product by cate and day
CATE2  1 9
CATE3  5 10

请注意,生产日期是从当前日期的早上 6 点开始

到下一个日期的凌晨 5.59 点

这就是我的难处。

请帮帮我。

【问题讨论】:

    标签: sql sql-server sql-server-2008 pivot pivot-table


    【解决方案1】:

    这是基本的数据透视查询:

    Declare @month int = 1
    ; With data as (
        Select [CATEGORY_ID], [PRODUCT], [PRODUCTION_DATE] = DATEPART(DAY, DATEADD(HOUR, -6, [PRODUCTION_DATE]))
        , [PRODUCT_YEAR] = DATEPART(YEAR, [PRODUCTION_DATE]), [PRODUCTION_MONTH] = DATEPART(MONTH, [PRODUCTION_DATE]) From [dbo].[tblProducts]
        --Where DATEPART(MONTH, DATEADD(HOUR, -6,[PRODUCTION_DATE])) = @month update if monthly/yearly query is needed
    )
    Select [CATEGORY_ID], [PRODUCTION_MONTH], [PRODUCTION_YEAR], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]
    From data
    Pivot (
        Count([PRODUCT])
        For [PRODUCTION_DATE] In
        ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])
        ) as piv
        Order By [CATEGORY_ID], [PRODUCTION_YEAR], [PRODUCTION_MONTH]
    

    我基本上将所有内容都偏移了 6 小时 (-6)。 20150101 06:00 变为午夜 20150101 00:00 和 5:59 变为前一天的 23;59。

    枢轴:https://technet.microsoft.com/fr-fr/library/ms177410%28v=SQL.105%29.aspx

    【讨论】:

    • 您的意思是DATEPART,而不是DATAPART?另外,除了 CTE 路由之外,为什么不将 SELECT 中的 PRODUCTION DATE 的月份添加到表中所有月份的数据透视表中,甚至可能是年份。
    • Datepart 已经修复,但谢谢 :) CTE 路由只是一个子查询。不要将其视为邪恶的 CTE。最佳实践建议首先在子查询或 CTE 中使用 3 个 reauiered 列准备数据,然后从中进行 Pivot。 CTE 更易于阅读和自行尝试。我不确定我是否理解您评论的最后一部分。
    • 没有反对 CTE。我只是建议您无需传递月份参数即可运行查询。另外,如果表格中出现几年,您将在所有年份中计算同一个月。看我的回答。
    • 问题是关于 6 小时的偏移量。不要像我希望的那样“给我写我的代码”。我想问的人会根据自己的需要调整它。
    • 确实!朱利安,我把你的好代码太从字面上理解了,为 OP 提前考虑了。跟上 MSSQL 的答案! SO见。
    【解决方案2】:

    要添加到 @Julien 的答案,您可以 group with pivot by PRODUCTION_DATE 的月份和年份,而无需使用 CTE 发送每个月的参数。

    SELECT 
        [CATEGORY_ID], [PRODUCTION_MONTH], [PRODUCTION_YEAR], 
        [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], 
        [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], 
        [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]
    FROM 
        (SELECT [CATEGORY_ID], [PRODUCT], 
                DATEPART(DAY, DATEADD(HOUR, -6, [PRODUCTION_DATE])) AS [PRODUCTION_DAY]),   
                DATEPART(MONTH, DATEADD(HOUR, -6, [PRODUCTION_DATE])) AS [PRODUCTION_MONTH],
                DATEPART(YEAR, DATEADD(HOUR, -6, [PRODUCTION_DATE])) AS [PRODUCTION_YEAR] 
         FROM [dbo].[tblProducts]) As tmpProducts
    
    PIVOT (
        Count([PRODUCT])
        FOR [PRODUCTION_DAY] In
           ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], 
            [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], 
            [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])
        ) as piv
    ORDER BY [CATEGORY_ID], [PRODUCTION_YEAR], [PRODUCTION_MONTH]
    

    示例输出:

    CATEGORY_ID PRODUCTION_MONTH    PRODUCTION_YEAR    1    2   3   4   5   6   7   8   ...
              1               1                2014   12    14  5   17  16  27  4   15
              1               2                2014   18    56  27  34  9   19  10  0
              1               1                2015   13    12  23  43  24  20  15  20
              1               2                2015   36    11  36  13  9   1   25  10
    ...
    

    【讨论】:

    • CTE 或子查询类似。我使用了一个参数,因为我认为他只是在寻找一个特定的月份。
    • 非常感谢。我已经复制和脚本运行满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 2019-01-02
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多