【问题标题】:case statement instead of multiple selectscase 语句而不是多个选择
【发布时间】:2012-10-16 16:43:32
【问题描述】:

我在下面有几个代码语句,我正在尝试找出一种方法来使这变得更加简单和容易。我认为 CASE 陈述是最好的,但经过几天的反复试验,我一直无法弄清楚如何做到这一点。任何和所有的帮助和/或解释将不胜感激。

select Count(lcs.statename)  as [Name 1]
   FROM hsi.itemlc as ilc
   LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
   where lcs.statename = 'Follow Up'
   AND lcnum = '412'
   AND status = '0'
select Count(lcs.statename)  as [Name 2]
   FROM hsi.itemlc as ilc
   LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
   where lcs.statename = 'Initial Review'
   AND lcnum = '412'
   AND status = '0'
select Count(lcs.statename)  as [Name 3]
   FROM hsi.itemlc as ilc
   LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
   where lcs.statename = 'Execution'
   AND lcnum = '412'
   AND status = '0'
select Count(lcs.statename)  as [Name 4]
   FROM hsi.itemlc as ilc
   LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
   where lcs.statename = 'Holdback'
   AND lcnum = '412'
   AND status = '0'

【问题讨论】:

  • SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...语法细节是特定于供应商的 - 所以我们真的需要知道您正在使用什么数据库系统(以及哪个版本)......

标签: sql select case


【解决方案1】:

尝试类似:

SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1],
    SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2],
    SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END) as [Name 3],
    SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END) as [Name 4]
FROM hsi.itemlc as ilc
LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
WHERE lcnum = '412'
AND status = '0'

【讨论】:

  • 效果很好……几天后就白费了,但感谢一百万
  • 现在,如果我要向其中添加其他列怎么办...我收到“消息 8120,第 16 级,状态 1,第 1 行列 'hsi.itemlc.itemnum' 在选择列表,因为它不包含在聚合函数或 GROUP BY 子句中。”尝试在 SELECT 之后直接将 ilc.itemnum 添加为 [test] 时出错
  • @John 你必须按该列分组。
【解决方案2】:

您可以使用 SUM() 和 CASE 来做到这一点:

SELECT
      SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END)  as [Name 1],
      SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END)  as [Name 2],
      ...
   FROM hsi.itemlc as ilc
   LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
   WHERE lcnum = '412' AND status = '0';

或者如果你可以读取多行,你可以使用GROUP BY:

SELECT lcs.statename, COUNT(*) AS num
    FROM hsi.itemlc as ilc
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
    WHERE lcnum = '412' AND status = '0'
    GROUP BY lcs.statename;

这会给你类似的东西

Follow Up        25
Initial Review   17
...

【讨论】:

    【解决方案3】:

    您可以将 CASE 语句与 SUM() 函数一起使用,如下所示:

    SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END)  as [Name 1],
           SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END)  as [Name 2],
           SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END)  as [Name 3],
           SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END)  as [Name 4]
    FROM hsi.itemlc as ilc
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum
    WHERE lcnum = '412'
      AND status = '0'
    

    这会导致每个州名的条件计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多