【问题标题】:How to modify the following code to ignore rows with 0 and shows the output weekly如何修改以下代码以忽略具有 0 的行并每周显示输出
【发布时间】:2015-10-30 18:14:36
【问题描述】:

我的以下查询给出了图 1 中所示的输出。我想更改它,以便它给出图 2 中的输出。我想显示每周(即使值为 0)这是查询。请帮忙。

SELECT @MaxDate = @MaxDate
    ,@MinDate = dateadd(week, (@LastXWeeks + 1), @MaxDate);

WITH AllDates
AS (
    SELECT @MinDate AS xDate

    UNION ALL

    SELECT Dateadd(day, 1, xDate)
    FROM AllDates AS ad
    WHERE ad.xDate < @MaxDate
    )
SELECT 'playing' AS activity
    ,ad.xDate
    ,Isnull(t.TimePerDay, 0) AS TimePerDay
FROM AllDates AS ad WITH (NOLOCK)
LEFT JOIN @test AS t ON ad.xDate = t.DATE

【问题讨论】:

  • 我们可以把WHERE TimePerDay != 0放在这里
  • 否,因为它显示游戏的总和,如果没有玩游戏,则为 0。我会更新图片。

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

您希望每周获得结果,因此按周分组:

WITH AllDates
AS (
    SELECT @MinDate AS xDate

    UNION ALL

    SELECT Dateadd(day, 1, xDate)
    FROM AllDates AS ad
    WHERE ad.xDate < @MaxDate
    )
SELECT 
  'playing' AS activity
  ,min(ad.xDate) -- or max or the week number, whichever you like best
  ,Isnull(sum(t.TimePerDay), 0) AS TimePerDay
FROM AllDates AS ad WITH (NOLOCK)
LEFT JOIN @test AS t ON ad.xDate = t.DATE
GROUP BY datepart(wk, ad.xDate);

【讨论】:

  • 我将最后一行更改为按 datepart(wk, ad.xDate),Isnull(t.TimePerDay, 0) 分组,因为它给出了错误但输出不同
  • 你遇到了什么错误?我想你忘了用sum(t.TimePerDay)替换t.TimePerDay
  • Msg 8120,级别 16,状态 1,过程 spGetWalkingTimeOftheUsersPerWeek_updated_6_August,第 88 行列 '@test.TimePerDay' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中.
  • 是的,就是这样。您尝试访问t.TimePerDay,但每周有七个,因此您必须汇总它们:SUM(t.TimePerDay)
  • 这是有道理的。让我验证答案。
【解决方案2】:

试试这个

SELECT @MaxDate = @MaxDate
    ,@MinDate = dateadd(week, (@LastXWeeks + 1), @MaxDate);

WITH AllDates
AS (
    SELECT @MinDate AS xDate

    UNION ALL

    SELECT Dateadd(day, 1, xDate)
    FROM AllDates AS ad
    WHERE ad.xDate < @MaxDate
    )
SELECT * FROM
(
SELECT 'playing' AS activity
    ,ad.xDate
    ,Isnull(t.TimePerDay, 0) AS TimePerDay
FROM AllDates AS ad WITH (NOLOCK)
LEFT JOIN @test AS t ON ad.xDate = t.DATE
) as t WHERE TimePerDay<>0

【讨论】:

  • 请检查我的问题更新。实际上,我想按周显示,即使值为 0。我猜你的解决方案会截断 0
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2020-07-18
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多