【问题标题】:T-SQL Union returns duplicated row (date)T-SQL 联合返回重复的行(日期)
【发布时间】:2018-09-20 22:15:38
【问题描述】:

我试图解决在特定日期范围内为每个日期返回总和的问题,无论数据是否存在一天。

我发现最好的方法是使用预先填充了所有日期的表格,选择日期范围并将其与我的数据合并。

由于某种原因无法离开加入工作,但工会看起来工作几乎完美。唯一的问题是它会返回我的数据表中存在数据的日期的重复项。

SELECT NULL AS Visitors
,D.DATE AS Day
FROM Database.support.dates D
WHERE D.DATE BETWEEN @Start_date
    AND @End_date

UNION

SELECT count(V.id) AS Visitors
,DATEADD(day, 0, DATEDIFF(day, 0, V.CreateTime)) AS Day
 FROM Database.Clients.Clients V
 WHERE V.CreateTime BETWEEN @Start_date
    AND @End_date
AND V.WADID = @WADID
AND (
    V.WAPID = @WAPID
    OR @WAPID IS NULL
    )
GROUP BY DATEADD(day, 0, DATEDIFF(day, 0, V.CreateTime))
ORDER BY Day DESC

前一天一直在研究它,但仍然无法正常工作:/

【问题讨论】:

  • 一个有趣的事实:如果您将整个查询合并到自身,您实际上会得到去重结果。
  • 你为什么不只是在左连接上寻求帮助?您的 where 条件存在冲突。
  • 有趣的@SQL_M :)

标签: tsql join union


【解决方案1】:

我认为将日历表加入当前查询实际上是正确的做法。话虽如此,您可以通过简单地汇总当天来纠正您当前的情况,例如使用MAX。默认情况下,每天的 NULL 值将被忽略,只要存在非空访问者计数:

WITH cte AS (
    SELECT NULL AS Visitors, D.DATE AS Day
    FROM Database.support.dates D
    WHERE D.DATE BETWEEN @Start_date AND @End_date

    UNION

    SELECT COUNT(V.id), DATEADD(day, 0, DATEDIFF(day, 0, V.CreateTime))
    FROM Database.Clients.Clients V
    WHERE V.CreateTime BETWEEN @Start_date AND @End_date AND
        V.WADID = @WADID AND (V.WAPID = @WAPID OR @WAPID IS NULL)
    GROUP BY DATEADD(day, 0, DATEDIFF(day, 0, V.CreateTime))
)

SELECT Day, MAX(Visitors) AS Visitors     -- filter off unwanted NULL values
FROM cte
GROUP BY Day
ORDER BY Day DESC;

【讨论】:

  • 工作得很好 :) 谢谢你。
  • @mike86 很高兴它可以工作,但请注意,使用日历表的常用方法实际上是加入。您也可能对该查询有疑问。
猜你喜欢
  • 2011-11-05
  • 1970-01-01
  • 2017-04-13
  • 2021-04-30
  • 1970-01-01
  • 2011-04-26
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多