【发布时间】:2017-05-04 05:45:01
【问题描述】:
我有一个表 STOCK_REGISTER,其中有 Id、ItmId、Qty、CreatedDate 列。并且有每日的交易数据,比如项目向内、向外和所有。
现在我正在开发一份月度报告,我想在其中显示整个月项目数量的按日汇总。为此,我编写了以下查询。
SELECT CONVERT(Date,CreatedDate) AS CreatedDate,ItmId, SUM(Qty)
FROM STOCK_REGISTER
GROUP BY CONVERT(Date,CreatedDate),ItmId
此查询返回正确的数据,但如果我要的是 2017 年 4 月的数据并且 STOCK_REGISTER 在 4 月 5 日没有任何记录,那么它根本不会显示 4 月 5 日,我需要 0 值在 4 月 5 日该项目的数量.
您能帮我获取此类数据吗?
编辑:
我创建了一个查询,它给出了任何特定月份的所有天数,并使用 STOCK_REGISTER 应用了左联接,但仍未解决我的问题。
declare @month int, @year int
set @month = 4
set @year = 2017
SELECT CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number AS STKFG_CREATED_DATE,
B.STKFG_ITM_ID,
0 AS OPENING_STOCK,
SUM(STKFG_QTY)
FROM master..spt_values A
LEFT JOIN STOCK_REGISTER_FG B
ON CONVERT(DATE,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number) = CONVERT(DATE,B.STKFG_CREATED_DATE)
AND C.ITM_ID = B.STKFG_ITM_ID
WHERE type = 'P'
AND (CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number ) <
DATEADD(mm,1,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) )
AND STKFG_TRAT_ID = 6
GROUP BY A.Number, B.STKFG_ITM_ID
ORDER BY B.STKFG_ITM_ID,CAST(CAST(@year AS VARCHAR) + '-' + CAST(@Month AS VARCHAR) + '-01' AS DATETIME) + A.Number
【问题讨论】:
-
你可以有一个通用的日历表,并通过左连接将该表用作日期的源。
-
如果某些日期根本不存在于您的数据集中,那么您需要以某种方式将它们引入。日历表是一种选择。
-
您需要这些数据的日期范围是多少?
-
2 种方式:1-无论是在
STOCK_REGISTER表中插入数据,计划这样的方式,如果没有发生导出导入,那么它也会在当天结束时插入当前日期的数据.2-创建一个带有全年日期(SELECT to_date('01/01/2014', 'dd/mm/yyyy') + rownum - 1 AS all_date FROM dual CONNECT BY LEVEL <= 365;)的表格,并与您的表格进行左连接。 -
@BennjoeMordeno 我已经使用了这个逻辑。我已经从查询中获得了所有天数,并且已经对我的表应用了左联接,但我仍然没有得到日期不存在的记录
标签: sql sql-server