具有多个字段的SSMS案例声明

时间:2019-10-15 16:16:49

标签: case sql-server-2014 unpivot

我有一个case语句,可以对金额进行总计,四舍五入和加标签,但效果很好,但是数据最终以水平格式显示(每条记录有多个金额),这导致我无法在随后的语句中进行枢纽操作以垂直格式化数据(每条记录一个金额)。如果可能的话,我想在一份声明中完成。我的代码如下:

SELECT
    Field,
    ROUND(SUM(CASE
                  WHEN TYPE = 'Paid Loss'
                  THEN AMOUNT
                  ELSE 0
              END
          ), 2
    ) PAID,
    ROUND(SUM(CASE
                  WHEN TYPE = 'OS'
                  THEN AMOUNT
                  ELSE 0
              END
          ), 2
    ) OS,
    ROUND(SUM(CASE
                  WHEN TYPE <> 'Paid Exp'
                  THEN AMOUNT
                  ELSE 0
              END
          ), 2
    ) INCURRED
FROM dbo.mydatabase
GROUP BY Field;

结果是:

Field   |PAID |OS  |INCURRED
----------------------------
result1 | 1   | 20 | 10
result2 | 5   | 30 | 15 

当我真正想要的是:

Field   | DATA_TYPE | AMOUNT
---------------------------
result1 | PAID      | 1
result2 | PAID      | 5
result3 | OS        | 20
result4 | OS        | 30
result5 | INCURRED  | 10
result6 | INCURRED  | 15

键将是唯一的,所以这不是问题。有人知道如何重新排列CASE,以便可以在一个语句中完成吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这行不通吗?

SELECT Field, 'PAID' DATA_TYPE, ROUND(SUM(AMOUNT), 2) AMOUNT
FROM dbo.mydatabase
WHERE TYPE = 'Paid Loss'
GROUP BY Field

UNION ALL

SELECT Field, 'OS' DATA_TYPE, ROUND(SUM(AMOUNT), 2) AMOUNT
FROM dbo.mydatabase
WHERE TYPE = 'OS'
GROUP BY Field

UNION ALL

SELECT Field, 'INCURRED' DATA_TYPE, ROUND(SUM(AMOUNT), 2) AMOUNT
FROM dbo.mydatabase
WHERE TYPE <> 'Paid Exp'
GROUP BY Field

甚至是这样:

SELECT Field
  , (CASE
     WHEN TYPE IN ('Paid Loss', 'OS') THEN TYPE
     WHEN TYPE <> 'Paid Exp' THEN 'INCURRED'
     END) DATA_TYPE
  , ROUND(SUM(AMOUNT), 2) AMOUNT
FROM dbo.mydatabase
GROUP BY Field
  , (CASE
     WHEN TYPE IN ('Paid Loss', 'OS') THEN TYPE
     WHEN TYPE <> 'Paid Exp' THEN 'INCURRED'
     END) DATA_TYPE