【问题标题】:MSSQL - GROUP BY Date statement showing wrong dataMSSQL - GROUP BY 日期语句显示错误数据
【发布时间】:2018-07-27 11:43:33
【问题描述】:

我有一个 GROUP BY 语句,它根据周对我的数据进行排序。这里的问题是我的数据整周都没有被计算在内(星期日不计算在内)

这是一个例子:

CREATE TABLE [dbo].[Products](
[ProductNR] [varchar](14) NULL,
[Location] [int] NULL,
[Date] [datetime] NULL);

INSERT INTO Products (ProductNR, Location, Date)
VALUES 
('12345678911' ,1, '2018-07-16 00:00:00.000'), -- Monday
('12345678912' ,1, '2018-07-16 00:00:00.000'), -- Monday
('12345678913' ,1, '2018-07-16 00:00:00.000'), -- Monday
('12345678914' ,1, '2018-07-16 00:00:00.000'), -- Monday
('12345678915' ,2, '2018-07-16 00:00:00.000'), -- Monday
('12345678916' ,3, '2018-07-22 00:00:00.000'); -- This is a sunday

这是我的 Sql 查询,它在 2 周内检索上述数据拆分,而它应该是一周的计数:

SELECT count(Distinct ProductNR) AS [Count]
FROM Products
WHERE
YEAR (CREATED) = '2018'
Group by datepart(wk, created), year(created) 

结果:

|Count|
|  5  |
|  1  |

预期结果:

|Count|
|  6  |

【问题讨论】:

  • 您为什么希望 22 日与 16 日而不是 23 日在同一周计算?

标签: sql sql-server date group-by


【解决方案1】:

看来你想要ISO_WEEK

SELECT COUNT(DISTINCT ProductNR) AS [Count]
FROM Products
WHERE YEAR (CREATED) = '2018'
GROUP BY DATEPART(ISO_WEEK, created), YEAR(created); 

【讨论】:

  • 这在新年前后会有一些问题。 '2018-12-31' 是星期一和第 1 周,即使它使用 iso_week 属于 2019 年第 1 周,也将被计为 2018 年第 1 周
  • 你好,我刚刚意识到这个答案是错误的:ISO_Week 从星期一到星期一计数,WK 从星期日到星期日计数
【解决方案2】:
SELECT 
  count(Distinct ProductNR) AS [Count]
FROM Products
WHERE
  CREATED >= '2018-01-01' and CREATED < '2019-01-01'
GROUP BY 
  datediff(d, 0, created) / 7

如果你想包含星期,这里有一个完整的脚本,包括 iso year 和 iso week

DECLARE @year DATE = '2018'

SELECT 
    count(Distinct ProductNR) AS [Count], 
    datepart(yy, dateadd(wk, datediff(d, 0, CREATED)/7, 3)) year,
    datepart(iso_week, CREATED) week
FROM Products
WHERE
    CREATED >= dateadd(wk, datediff(d, 0, dateadd(d, 3, @year))/7, 0)
    and CREATED < dateadd(wk, datediff(d, 0, dateadd(d, 3, dateadd(yy, 1, @year)))/7, 0)
GROUP BY 
    datepart(yy, dateadd(wk, datediff(d, 0, CREATED)/7, 3)),
    datepart(iso_week, CREATED)

【讨论】:

  • 你的 sql 语句给我的 pr 周计数错误,数字太大
  • @MishMish 你是对的,我使用 getdate 作为测试数据并且没有将它改回创建。它现在应该可以工作了
  • 第二个 sql 语句我得到以下信息: 列 'Products.Created' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。并且第一个 sql 语句每周的计数仍然太大
  • 现在它没有显示任何错误,但也没有数据:/
  • 在所有表达式中应该是 yy 而不是 y。立即尝试
【解决方案3】:

问题是有些地方从星期天开始,所以我认为 sql 将 2018-07-22 计为下周的一部分

你可以试试ISO_WEEK

SELECT count(Distinct ProductNR) AS [Count]
FROM Products
WHERE
YEAR (CREATED) = '2018'
Group by datepart(ISO_WEEK, created), year(created) 

【讨论】:

    【解决方案4】:

    只需使用以下查询将星期一设置为一周的第一天: 设置日期优先 1
    @MishMish 这是我使用的代码 sn-p

    <!-- language: sql -->
    USE tempdb
    IF EXISTS( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Products')
        DROP TABLE Products
    
    CREATE TABLE [Products](
    [ProductNR] [varchar](14) NULL,
    [Location] [int] NULL,
    [Date] [datetime] NULL);
    
    INSERT INTO Products (ProductNR, Location, Date)
    VALUES 
    ('12345678911' ,1, '2018-07-16 00:00:00.000'), -- Monday
    ('12345678912' ,1, '2018-07-16 00:00:00.000'), -- Monday
    ('12345678913' ,1, '2018-07-16 00:00:00.000'), -- Monday
    ('12345678914' ,1, '2018-07-16 00:00:00.000'), -- Monday
    ('12345678915' ,2, '2018-07-16 00:00:00.000'), -- Monday
    ('12345678916' ,3, '2018-07-22 00:00:00.000'); -- This is a sunday
    
    --SELECT  datepart(wk, Date) as Week, * FROM Products
    
    --Count Before Setting First Date To Monday
    SET DATEFIRST 7  -- Sunday ( default, U.S. English)
    
    SELECT count(Distinct ProductNR) AS [Count]
    FROM Products
    WHERE
    YEAR (Date) = '2018'
    Group by datepart(wk, Date), year(Date) 
    
    --CHANGE FIRST Date To Monday
    SET DATEFIRST 1
    
    --Count AFTER Setting First Date To Monday
    SELECT count(Distinct ProductNR) AS [Count]
    FROM Products
    WHERE
    YEAR (Date) = '2018'
    Group by datepart(wk, Date), year(Date) 
    

    【讨论】:

    • 它没有改变任何东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多