【问题标题】:convert days to weeks in SQL server 2008r2在 SQL Server 2008r2 中将天转换为周
【发布时间】:2016-05-24 13:18:48
【问题描述】:

我有一个表,其唯一的日期字段是 smalldatetime 和 DOW(第 1 周的第 1 天 = 星期日)。

我需要汇总这些天以获取特定周/年组合的每周平均值(以下脚本不包含小时和分钟)。

如何将 smalldate 和 DOW 转换为年和周#?我有一个可以链接到的表,它使用星期六(DOW 7)作为 WeekEndDate,如果我能做到那么远,我可以链接到该表。任何帮助将不胜感激。

例如,此语句提供以下结果:

select a.LOB_Code, a.store, day, DOW, hour, minutes, (sum(NetTrans)/1.000)sumNetTrans

from facts.Store_Day_TransBy30 a

inner join facts.Stores b on a.Store = b.Store

where A.store = 8169 and DAY between '1/3/2016' and '1/4/2016' 

group by a.LOB_Code, a.store, day, DOW, hour, minutes

order by a.LOB_Code, a.store, day, DOW, hour, minutes

enter image description here

【问题讨论】:

  • 您需要举例说明您拥有的数据以及您想要从中派生的数据。
  • 看这里如何发布问题:spaghettidba.com/2015/04/24/…
  • 请编辑您的问题以包含示例数据(最好是 DDL+DML 语句)和所需结果。

标签: sql-server date


【解决方案1】:

这里还有另一个带有临时表和手动生成数据的查询。始终建议提供一些示例数据以获取完整的图片。

SET NOCOUNT ON;
CREATE TABLE DemoTable
(
ID INT IDENTITY(1,1) NOT NULL,
DateCreated SMALLDATETIME,
DOW TINYINT NOT NULL, -- This can be generated runtime(DATEPART(DW,date column)) but as your table contain thsi column I've purposefully added here.
TmpCount INT NOT NULL -- Random column used for aggregation
)

-- Populate some records 

DECLARE @CurrentDate DATE='2015-01-01'

WHILE @CurrentDate <='2016-12-31'
BEGIN

    INSERT DemoTable
    (
        DateCreated,
        DOW,
        TmpCount
    )
    SELECT
        @CurrentDate AS DateCreated,
        DATEPART(DW,@CurrentDate) AS DOW,
        ABS(Checksum(NewID()) % 6) + 1 AS TmpCount

    SET @CurrentDate=DATEADD(dd,1,@CurrentDate)
END

-- Retrieve aggregated data 
SELECT 
    YEAR(DateCreated) AS Year#
    ,DATEPART(WK,DateCreated) AS Week#
    ,SUM(TmpCount) AS TmpSum 
FROM DemoTable
GROUP BY YEAR(DateCreated),DATEPART(WK,DateCreated)
ORDER BY 1,2
-- Drop Table

DROP TABLE DemoTable

【讨论】:

  • 哇——这超出了我的理解能力。不幸的是,我无权在我们公司的 sql 服务器上创建表。但感谢您花时间创建它。它看起来令人印象深刻。
【解决方案2】:

我假设 day 列是数据类型,这是可以帮助你的查询。

SELECT
    a.LOB_Code, 
    a.store, 
    day,
    DOW, 
    hour, 
    minutes, 
    (sum(NetTrans)/1.000)sumNetTrans,
    YEAR([day]) AS Year#,
    DATEPART(WK,[day]) AS Week#

from facts.Store_Day_TransBy30 a

inner join facts.Stores b on a.Store = b.Store

where A.store = 8169 and DAY between '1/3/2016' and '1/4/2016' 

group by a.LOB_Code, a.store, day, DOW, hour, minutes,YEAR([day]),DATEPART(WK,[day])

order by a.LOB_Code, a.store, day, DOW, hour, minutes

【讨论】:

  • SandeshP,谢谢你。总体思路是从结果中删除天、道、小时、分钟以获得每周平均值 - 一次总结和平均 7 天 - 以某种方式创建虚拟周。
  • 我正在设想一个 case 语句,它计算出一个 1:7 的序列并将它们加在一起,但我无法弄清楚。
  • 我相信我们需要计算星期数/星期几。因此,如果“天”是您表中的列,那么我们可以使用 SQL Server 内置函数来获取星期数/星期几。 DATEPART(WK,[day]) -- 周数 & DATEPART(DW,Day) -- 星期几
  • 问题是我们的 2016 财年第 1 周是 Jan3-Jan9(Sun-Sat: 1:7)
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多