嵌套“ sum(case when)”语句中的语法错误

时间:2019-09-18 20:37:13

标签: sql sql-server

我有一个数据库,其中包含来自多家公司的信息,这些公司以不同的方式记录其数据。为了标记什么是贷项通知单/财务费用/发票/等-3家公司使用特定字段,而其他3家公司仅依靠正值或负值。

但是我需要总计-我将经常需要它们...所以我认为Sum Case陈述是必经之路。

我已经在该网站上阅读了许多类似的问题,但是找不到有效的修复程序。大多数不是针对SSMS的,就是不针对多个限定词的。

我可以按公司逐个汇总个人,但似乎应该有一种方法可以一次性完成所有工作。因此,这就是我要想到的:

SUM(CASE WHEN((ff29='invoice' AND (import_source_id=1 OR import_source_id=2 OR import_source_id=6)) OR (amount_invoice>0 AND (import_source_id=4 OR import_source_id=5 OR import_source_id=8)) THEN CAST(amount_invoice AS DECIMAL(18,2)) ELSE 0 END) AS 'Debits',

SUM(CASE WHEN((ff29='credit memo' AND (import_source_id=1 OR import_source_id=2 OR import_source_id=6)) OR (amount_invoice<0 AND (import_source_id=4 OR import_source_id=5 OR import_source_id=8)) THEN CAST(amount_invoice AS DECIMAL(18,2)) ELSE 0 END) AS 'Credits'

我希望每个公司(import_source_id)的结果显示为2列(借方和贷方),但仅包括某些结果,这在我的数据库中被每个公司记录为不同。

  

消息156,级别15,状态1,第4行关键字附近的语法不正确   '然后'。消息102,级别15,状态1,第10行'='附近的语法不正确。   消息102,级别15,状态1,第11行,'='附近的语法不正确。

我也不知道这些问题框中的代码末尾要放什么,让它像其他所有人一样很好地分隔在灰色框中。所以,我为此表示歉意。

1 个答案:

答案 0 :(得分:1)

在两个WHEN之后都删除左括号(或在THEN之前添加一个右括号):

SUM(CASE 
  WHEN
    (ff29='invoice' AND (import_source_id=1 OR import_source_id=2 OR import_source_id=6)) 
    OR 
    (amount_invoice>0 AND (import_source_id=4 OR import_source_id=5 OR import_source_id=8)) 
  THEN CAST(amount_invoice AS DECIMAL(18,2)) 
  ELSE 0 
END) AS 'Debits',

SUM(CASE 
  WHEN
    (ff29='credit memo' AND (import_source_id=1 OR import_source_id=2 OR import_source_id=6)) 
    OR 
    (amount_invoice<0 AND (import_source_id=4 OR import_source_id=5 OR import_source_id=8)) 
  THEN CAST(amount_invoice AS DECIMAL(18,2)) 
  ELSE 0 
END) AS 'Credits'

为什么不使用IN来简化:

SUM(CASE 
  WHEN
    (ff29='invoice' AND (import_source_id IN (1,2,6)) 
    OR 
    (amount_invoice>0 AND (import_source_id IN (4,5,8)) 
  THEN CAST(amount_invoice AS DECIMAL(18,2)) 
  ELSE 0 
END) AS 'Debits',

SUM(CASE 
  WHEN
    (ff29='credit memo' AND (import_source_id IN(1,2,6)) 
    OR 
    (amount_invoice<0 AND (import_source_id(4,5,8)) 
  THEN CAST(amount_invoice AS DECIMAL(18,2)) 
  ELSE 0 
END) AS 'Credits'