【问题标题】:Case Stament, GroupBy and Count not grouping correctly案例语句、分组依据和计数未正确分组
【发布时间】:2017-04-20 18:24:38
【问题描述】:

我有一个 SQL,它使用 case 语句来组合两个字段和一个带有计数的 groupby。 我的查询工作没有错误,但它没有对具有两个不同名称但在 case 语句中具有相同名称的数据进行分组/计数。

SELECT   EMPLY, 
         Case when CCode = 'L1' then 'LongTerm' 
              when CCode = 'D1' then 'ShortTerm' 
              when RPolicy = 'C1' then 'Custom' 
              when RPolicy = 'H1' then 'Custom' end AS [FileType], 
         Count(AccountNumber) AS Total 
FROM     dbo.Accounts 
WHERE    Date like '%2017%' 
GROUP BY EMPLY, RPolicy, CCode
ORDER BY 1

我需要知道如何按我的新列“文件类型”进行分组?

输出:

EMPLY   File Type   Total
EMPLY1  LongTerm    12
EMPLY1  Custom      1
EMPLY1  Custom      5
EMPLY1  ShortTerm   3
EMPLY2  LongTerm    16
EMPLY2  Custom      3
EMPLY2  Custom      6
EMPLY2  ShortTerm   8
EMPLY3  LongTerm    20
EMPLY3  Custom      2
EMPLY3  Custom      10
EMPLY3  ShortTerm   4

任何帮助将不胜感激。 我正在使用 AQT/SQL Server

【问题讨论】:

  • 按案例陈述分组。并使用。从组中消除 RPolicy、CCode。注意:如果您有 ccode L1 和 RPolicy H1 的记录,那么文件类型将是 longTerm,它不能同时是两者。如果找到第一个匹配项,则案例存在一次。
  • 您的输出是因为您按 RPolicy 分组。和 C 代码。你的 group by 应该只是 GROUP BY Emply, Case when CCode = 'L1' then 'LongTerm' when CCode = 'D1' then 'ShortTerm' when RPolicy = 'C1' then 'Custom' when RPolicy = 'H1' then 'Custom' end 如果你得到相同的结果,那么你还没有消除 RPolicy 和 CCode。

标签: group-by count case


【解决方案1】:

这是你想要做的吗?

(您不能在 group by 中使用别名,因为它在 select 之前执行,但是,您可以使用完整的 case 语句!)

SELECT   EMPLY, 
         Case when CCode = 'L1' then 'LongTerm' 
              when CCode = 'D1' then 'ShortTerm' 
              when RPolicy in ('C1','H1') then 'Custom' end AS [FileType], 
         Count(AccountNumber) AS Total 
FROM     dbo.Accounts 
WHERE    Date like '%2017%' 
GROUP BY EMPLY, Case when CCode = 'L1' then 'LongTerm' 
              when CCode = 'D1' then 'ShortTerm' 
              when RPolicy In ('C1','H1') then 'Custom' end
ORDER BY EMPLY, FileType, Total

这个子查询也应该可以工作,但它是开销。

SELECT   A.EMPLY
       , A.FileType
       , Count(1) AS Total 
FROM     (SELECT EMPLY
               , Date
               , Case when CCode = 'L1' then 'LongTerm' 
                      when CCode = 'D1' then 'ShortTerm' 
                      when RPolicy in ('C1','H1') then 'Custom' 
                 end AS FileType
         FROM dbo.Accounts) A
WHERE    A.Date like '%2017%' 
GROUP BY A.EMPLY, A.FileType
ORDER BY A.EMPLY, A.FileType

【讨论】:

  • 是的,我试过这个,我得到了相同的结果。我正在尝试创建一个报告,告诉我每个员工正在执行多少文件。 C1 和 H1 需要算作一个组合类别,“自定义”。
  • dbo.accounts 中的“日期”是字符数据类型还是日期数据类型?并且它的'非常不可能这会产生相同的结果。我们按完全不同的东西分组!
  • 这是一个起始日期,都在同一个数据表中
  • 是的,但就像 '%2017%' 暗示字符串格式,如果它是一个日期,你真的应该使用年份函数year(date) = 2017 我只是不喜欢将日期视为字符数据。日期应该是日期。对它们进行数学运算的数字和其他所有字符。
  • 是的,我得到了同样的结果。我认为当我希望将这两个分组并汇总为“自定义”时,它将 C1 与 H1 分开分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2018-07-28
相关资源
最近更新 更多