【问题标题】:Cast 0 count on mondays by week when no data is returned, SQL在没有返回数据的情况下,每周的星期一投 0 计数,SQL
【发布时间】:2019-10-04 14:34:10
【问题描述】:

我正在尝试编写一个 sql 查询,该查询将返回按周开始的所有产品的计数。日期是每周一。因此,每一行都将返回该周的星期一以及该周开始的单位总数。运行报告的当前季度中的每一周需要的总周数。我有这个代码,但是当那周没有创建单位时,数据就会丢失。我需要在没有单位开始的周返回 0,而不是它不存在。我在网上找到了一些资源,但他们大多使用我的 SSMS 似乎没有的“generate_series”命令。

示例数据:tableA

Product--------DateStarted-----
1              2019-10-2
1              2019-10-4
1              2019-10-3
1              2019-10-23
1              2019-11-08
1              2019-11-09

-

期望的结果:

 Week----------Product Count
 2019-09-30    3
 2019-10-07    0
 2019-10-14    0
 2019-10-21    1
 .....Continued 0s for each week with the date being monday
 2019-11-04    2
 ...continued to end of quarter
 2019-12-30     0

-

当前结果:

  Week------------ProductCount-----
  2019-09-30      3
  2019-10-21      1
  2019-11-04      2

-

当前的 SQL 代码

SELECT Count([week]) as 'TotalStarted', [week] FROM 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) tbla 
Group by [Week]

【问题讨论】:

  • 您需要创建一个包含您感兴趣的所有星期的表变量(或临时表或永久表)。到处都有很多示例说明如何这样做(手动,递归 CTE,while 循环)。创建包含每个星期一的表后,您只需从该表开始,然后将查询作为子查询加入。左连接将显示“缺失”周。
  • @avery_larry 很抱歉回复太长,参加会议。我将尝试制作一个独立的表并对其进行连接。我会发布我的结果。

标签: sql-server date casting count


【解决方案1】:

使用有

SELECT Count([week]) as 'TotalStarted', [week] FROM 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) tbla 
Group by [Week]
HAVING Count([week])>0

对不起,我真的看错了。 尝试这样的事情。 事实上,这是 avery_larry 的答案
如果您认为您必须调整一周中的代表日


;WITH [0 to 12] (v) as 
(
SELECT V
FROM (
  VALUES (0), (1), (2), (3), (4), (5) ,(6), (7), (8), (9), (11), (12) 
)T(V)
),
[date_in_qq] (week) as (
    SELECT DATEADD(day,DATEDIFF(day,0,DATEADD(qq, DATEDIFF(qq, 0, GETDATE()),0)),v*7)
    FROM [0 to 12]
)
SELECT Count(tbla.[week]) as 'TotalStarted', [date_in_qq].[week] FROM 
[date_in_qq] 
LEFT OUTER JOIN 
(SELECT 
DATEADD(DAY, 2 -DATEPART(WEEKDAY, Crated),  CAST(DateStarted as date)) as 'Week' 
FROM tableA 
WHERE Product like ('1') 
AND [DateStarted] >= DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0) AND 
[DateStarted] <= DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) +1, 0))) 
tbla ON tbla.[week] = [date_in_qq].[week]
Group by [date_in_qq].[Week]

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多