我正在尝试按日期计算所有打开的门票/已关闭门票组。有些日期的两个值都是0,但我还是想显示日期。我觉得我很接近,但似乎无法让分组正确,它只是给出一个总数。
DECLARE @DateFrom AS DATE = '11/16/2016'
DECLARE @DateTo AS DATE = GETDATE()
WITH DateRanges AS
(SELECT @DateFrom AS 'DateValue'
UNION ALL
SELECT DATEADD(DAY, 1, DateValue)
FROM DateRanges
WHERE DateValue < @DateTo)
SELECT CONVERT(varchar(10),DateValue, 101) AS "DateVal",
(SELECT
COUNT(OPENDATE)
FROM DateRanges AS a
LEFT OUTER JOIN MAINTABLE
ON a.DateValue = convert(varchar(10), DATEADD(hh, DATEDIFF(HH, GetUTCDATE(), GETDATE()), OPENDATE), 101)
) AS opn,
(SELECT
COUNT(CLOSEDDATE)
FROM DateRanges AS b
LEFT OUTER JOIN MAINTABLE
ON b.DateValue = convert(varchar(10), DATEADD(hh, DATEDIFF(HH, GetUTCDATE(), GETDATE()), CLOSEDDATE), 101)
) AS cls
FROM DateRanges
GROUP BY CONVERT(varchar(10),DateValue, 101)
这会产生以下结果:
DateVal | opn | cls
11/16/2016 | 3 | 3
11/17/2016 | 3 | 3
11/18/2016 | 3 | 3
MainTable
ID | OPENDATE | CLOSEDDATE
123 | 11/16/2016 | 11/16/2016
124 | 11/16/2016 | 11/18/2016
125 | 11/18/2016 | 11/18/2016
预期产出
DateVal | opn | cls
11/16/2016 | 2 | 1
11/17/2016 | 0 | 0
11/18/2016 | 1 | 2
感谢您的帮助
答案 0 :(得分:2)
您可以使用自己的方法,但需要相关的子查询,而不是总计:
WITH DateRanges AS (
SELECT @DateFrom AS 'DateValue'
UNION ALL
SELECT DATEADD(DAY, 1, DateValue)
FROM DateRanges
WHERE DateValue < @DateTo
)
SELECT CONVERT(varchar(10), DateValue, 101) AS "DateVal",
(SELECT COUNT(mt.REQDATE)
FROM MAINTABLE mt
WHERE dr.DateValue = convert(varchar(10), DATEADD(hour, DATEDIFF(hour, GetUTCDATE(), GETDATE()), mt.OPENDATE), 101)
) AS opn,
(SELECT COUNT(CLSDDATE)
FROM MAINTABLE mt
WHERE dr.DateValue = convert(varchar(10), DATEADD(hh, DATEDIFF(hour, GetUTCDATE(), GETDATE()), mt.CLOSEDDATE), 101)
) AS cls
FROM DateRanges dr;
另请注意,您不需要在外部查询中使用聚合。