SELECT
workdate,
SUM(Sam) ttlsam
FROM
Sah
WHERE
workdate BETWEEN '01 May 2016' AND ' 05 May 2016'
GROUP BY
workdate
我执行了上面的命令,结果是
Workdate ttlsam
02 may 10
03 may 20
04 may 40
这里没有显示01年5月5日,因为这两个日期没有数据。但我想要这样。我的意思是虽然01和05可能没有数据,但他们需要在ttlsam字段中显示0或null值
01 may 0
02 may 10
03 may 20
04 may 40
05 may 0
答案 0 :(得分:1)
如果您想在MS SQL中执行此操作,这可能会有所帮助
DECLARE @DateTable TABLE
(
DateValue DATE NOT NULL
)
DECLARE @StartDate DATE
DECLARE @EndDate DATE
DECLARE @WorkingDate DATE
SET @StartDate = '01 MAY 2016'
SET @EndDate = '30 MAY 2016'
SET @WorkingDate = @StartDate
WHILE @WorkingDate <= @EndDate
BEGIN
INSERT INTO @DateTable
SELECT @WorkingDate
SET @WorkingDate = DATEADD(DAY,1,@WorkingDate)
END
SELECT * FROM @DateTable
DECLARE @tempData TABLE
(
workdate date
, Sam int
)
insert into @tempData
SELECT
'01 MAY 2016',
10
insert into @tempData
SELECT
'01 MAY 2016',
10
insert into @tempData
SELECT
'03 MAY 2016',
10
SELECT
dates.DateValue,
SUM(ISNULL(Sam,0)) ttlsam
FROM
@DateTable dates
left join
@tempData Sah
on
dates.DateValue = sah.workdate
WHERE
dates.DateValue BETWEEN '01 May 2016' AND ' 05 May 2016'
GROUP BY
dates.DateValue
这会产生类似这样的东西:
DateValue ttlsam
2016-05-01 20
2016-05-02 0
2016-05-03 10
2016-05-04 0
2016-05-05 0
显然,如果不知道你在幕后的实际数据是什么,我已经假设了一些东西并将数据集限制在你最初发布的内容中。
我所做的就是创建了一个dates
表格,您可以将其用作汇总表格,例如:你需要的日期。我已经在5月的前30天生成了它。但你可以拥有它一年等,只需更改开始和结束日期的值。
然后我们只是遍历日期并将它们添加到表中。
完成此操作后,您将运行相同的查询,但加入到您创建的临时表中。然后它将对值进行分组和求和。如果没有值存在,那么它将进行ISNULL检查并将零置于其中。
希望这会有所帮助。
答案 1 :(得分:0)
要获得没有漏洞的时间序列,例如,适用于绘制 ttlsam 与 workdate 的图形,您需要明确构建所有感兴趣的日期。 An example for Oracle。
然后,您可以为每个感兴趣的日期选择 Sam 列的总和,而不是原始表中的每个日期。 假设您已使用 d 列填充 dates_of_interest 表:
select d, sum(Sam) from dates_of_interest left outer join Sah on d=workdate group by d
答案 2 :(得分:0)
选择 dates.DateValue, SUM(ISNULL(Sam,0))ttlsam 从 @DateTable日期 离开加入 @tempData Sah 上 dates.DateValue = sah.workdate 哪里 date.DateValue BETWEEN '01 May 2016'和'2016年5月5日' 通过...分组 dates.DateValue。我想从SAH表中添加另一个条件,例如“像'K%'这样的行'我应该怎么做。