SQL加入多个子查询 - 按日期计算打开/关闭

Posted

技术标签:

【中文标题】SQL加入多个子查询 - 按日期计算打开/关闭【英文标题】:SQL Join Multiple Subqueries - Count Open / Closed by Date 【发布时间】:2016-11-18 22:40:21 【问题描述】:

我正在尝试按日期计算所有打开的门票/关闭的门票组。有些日期两者都有 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

主表

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

感谢您的帮助

【问题讨论】:

MAINTABLE 的架构是什么? MAINTABLE 有 OPENDATE、CLOSEDDATE、ID。它可能看起来像这样:ID |开放时间 |关闭日期 123 | 2016 年 11 月 16 日 | 2016 年 11 月 18 日 Nick 如果您在 MainTable 中显示示例数据和预期输出,对我们更有帮助的是,因为目前尚不清楚您要问什么或 MainTable 中的数据是什么以及您的预期输出是什么。我们可以看到到目前为止你已经得到了什么,但没有人知道你期望看到什么以获得可接受的输出。谢谢 抱歉,我已经用我希望看到的内容编辑了我的问题。谢谢 【参考方案1】:

您可以使用您的方法,但您需要相关子查询,而不是总计:

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;

另请注意,您不需要在外部查询中进行聚合。

【讨论】:

这成功了!我不得不稍作调整并将 FROM MAINTABLE mt 放在第一个子查询中以匹配第二个子查询,但它工作得很好!非常感谢,我很感激。

以上是关于SQL加入多个子查询 - 按日期计算打开/关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 SQL 查询来计算按日期分组和连接的项目? [关闭]

SQL 查询 - 多个日期范围

Oracle sql subselect 查找聚合值

T-SQL 子查询 Max(Date) 和连接

如何在 Looker 中按日期计算状态变化?

子查询计算日期之间的天数