【问题标题】:Why a field is needed in a GROUP BY clause if I need it only for conditional in a WHEN clause?如果我只需要在 WHEN 子句中作为条件字段,为什么在 GROUP BY 子句中需要一个字段?
【发布时间】:2020-05-02 07:09:52
【问题描述】:

我正在尝试创建一个查询以获得如下图所示的结果。

每人一条线。

问题是,当我创建查询时,我仅将它们用于 WHEN CLAUSE 的字段(我什至不需要将它们显示为结果),它显示为要求添加它们的错误到 GROUP CLAUSE 或 AGGREGATE FUNCTIONS。这可能会在我的结果中为每个用户创建重复的行。

如果我将 UserLogon、JobPageFormat 和 JobIsDuplex 放在 group 子句中,我的查询就会运行。

我使用的数据库是 MS SQL Server 2008

请看我的sql查询

select UserLogon, count(TrackingId) as Jobs,

case
when JobPageFormat = 'A3' then SUM(TrackingPageCount*2)
when JobPageFormat != 'A3' then SUM(TrackingPageCount) 
end as Total_Pages, 

case
when JobPageFormat = 'A3' then SUM(TrackingColorPageCount*2)
when JobPageFormat != 'A3' then SUM(TrackingColorPageCount)
end as Color_Pages,

case
when JobPageFormat = 'A3' then (SUM(TrackingPageCount*2) - SUM(TrackingColorPageCount*2))
when JobPageFormat != 'A3' then (SUM(TrackingPageCount) - SUM(TrackingColorPageCount))
end as Mono_Pages,

case
when JobPageFormat = 'A3' and JobIsDuplex = 0 then SUM(TrackingPageCount*2)
when JobPageFormat != 'A3' and JobIsDuplex = 0 then SUM(TrackingPageCount)
end as Simplex,

case
when JobPageFormat = 'A3' and JobIsDuplex = 1 then SUM(TrackingPageCount*2)
when JobPageFormat != 'A3' and JobIsDuplex = 1 then SUM(TrackingPageCount)
end as Duplex

from scTracking 

where ComputerName like '%ServerXXX%'
and JobType in (1,2,3)
and StartDateTime > '2019-09-01'
and StartDateTime < '2019-10-01'
group by UserLogon, JobPageFormat, JobIsDuplex
order by UserLogon

在下面查看我得到的结果

有谁知道如何在不重复结果的情况下进行此查询?

亲切的问候, 卢西亚诺

【问题讨论】:

  • 从您的GROUP BY 中删除这两项:JobPageFormatJobIsDuplex,并在GROUP BY 中添加您正在使用SUM 的列
  • 任何被聚合的字段都需要在GROUP BY 子句中。同意@RyanWilson。
  • 如果您提供一些示例输入和预期输出,您将得到更好的答案。

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

您应该将总和更改为在 case 表达式之外:

SUM(case
    when JobPageFormat = 'A3' then TrackingPageCount
    ELSE TrackingPageCount
    end) as Total_Pages, 
SUM(CASE WHEN JobIsDuplex = 0 
        THEN
        CASE when JobPageFormat = 'A3' then TrackingPageCount*2
        ELSE TrackingPageCount
    end) as Simplex,
etc.

那么你可以把JobPageFormatJobIsDuplex从group by子句中去掉。

【讨论】:

  • 请注意,这是case 表达式,而不是声明。
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 2021-11-07
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多