Ситуация SSMS с несколькими полями - PullRequest
0 голосов
/ 15 октября 2019

У меня есть инструкция 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 голосов
/ 15 октября 2019

Разве это не сработает?

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
...