【问题标题】:SQL- Summing Case/When values from different fieldsSQL-汇总案例/当来自不同字段的值
【发布时间】:2016-06-16 17:32:44
【问题描述】:

我正在尝试对从 CASE/WHEN 语句生成的值求和。唯一的问题是值来自不同的字段。

示例:

这是我的查询中许多项目中的一个的一组开销值。在此示例中,我需要将开销值 14.850000 和 1.166600 与 16.016 相加。
vac_type 列确定成本的类型。在这种情况下,当 vac_type = WO1 或 WO2 时,它们是间接费用。 W10 不是,因此是 NULL 值。

总共有 12 个 vac_types 是开销值。它们都列在我的 CASE/WHEN 语句中。我需要按 item_no 对所有这些开销值求和,但由于 vac_type 字段有两个不同的值,我的查询认为它们彼此不同,无法求和。

这是我对 item_no 开销求和的不成功尝试。它会生成上面截图的来源列表:

SELECT DISTINCT 'Overhead' =  SUM(CASE
                          WHEN vac_type IN('A01', 'AD0', 'ADX', 'A01', 'CI0', 'DO1', 'DP9',
                          'O20', 'PWO', 'TO1', 'WO1', 'WO2')
                     THEN (Cost_Values)
                     ELSE NULL
                     END,
         item_no,
         comp_item,
         vac_type

FROM     table_1

GROUP BY item_no,
         comp_item,
         vac_type

【问题讨论】:

  • 编辑:我不能在 WHERE 语句中包含 vac_type,因为在完成管理费用后,我必须编写另一个 CASE/WHEN 语句来涵盖其他类型的成本。
  • 您只需从SELECT 列表和GROUP BY 中删除vac_type 列。另外,不需要DISTINCT
  • 如果您需要按项目求和,则从 select 和 group by 中删除 comp_item 和 vac_type,也不要使用“ELSE null”,而是使用 ELSE 0。
  • 您使用的是哪个 DBMS? 'Overhead' = SUM() 是无效的标准 SQL
  • @Lamak 谢谢,我没有意识到 vac_type 不必在 SELECT 列表中才能用作有效的过滤器!

标签: sql sum case-when


【解决方案1】:

感谢@Lamak 的回答。为了按 item_no 对开销求和,需要从 SELECT 和 GROUP BY 语句中删除任何唯一字段。通过删除 vac_type,我得到了我需要的数据。

SELECT 'Overhead' = Sum(CASE
                      WHEN vac_type IN ( 'A01', 'AD0', 'ADX', 'AO1',
                                                      'CI0', 'DO1', 'DP9', 'O20',
                                                      'PWO', 'TO1', 'WO1', 'WO2' ) 
                    THEN (Cost_Values)
                      ELSE NULL
                    END),

   item_no,
   comp_item_no
FROM     table_1

GROUP BY item_no,
     comp_item

【讨论】:

  • 哪个 DBMS 允许您将 varchar 与类似的数字进行比较? 'Overhead' = sum(...) 那应该做什么?比较 'Overhead' = 42 没有意义
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2020-12-23
  • 1970-01-01
  • 2018-01-13
  • 2021-10-26
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多