2016-08-25 2 views
0

Соответствующий (значительно сокращенная) часть моего SQL:Объединение запросов в одной строке дисплея в DB2

Select 
A.Client_ID, 
,CASE 
    WHEN FN.FLD_CD = 1 
    THEN 
     FN.AMOUNT 
     ELSE 
     NULL 
    END AS "LN1" 
,CASE 
    WHEN FN.FLD_CD = 2 
    THEN 
     FN.AMOUNT 
     ELSE 
     NULL 
    END AS "LN2" 
,CASE 
    WHEN FN.FLD_CD = 3 
    THEN 
     FN.AMOUNT 
     ELSE 
     NULL 
    END AS "LN3" 
    (...and so on) 
    FROM 
    ASSESSMENT A, 
    FINANCE FN 
    WHERE 
    A.CLIENT_ID  = FN.CLIENT_ID 
    AND FN.FLD_CD IN ('1', '2', '3') 
    (other irrelevant stuff) 
    ; 

Это отображает результаты из запроса на 3 отдельных линий (по одному для каждого кода поля). Как заставить его отображать все на одной строке?

Например, результаты являются:

Client_ID LN1 LN2  LN3 
10001  20  -  - 
10001  -  30  - 
10001  -  -  40 

, но я хотел бы это так:

Client ID LN1 LN2 LN3 
10001  20  30 40 

ответ

2

Использование условной агрегации. Предполагая, что одно значение каждого клиента по коду:

SELECT A.Client_ID, 
     MAX(CASE WHEN FN.FLD_CD = 1 THEN FN.AMOUNT END) as LN1, 
     MAX(CASE WHEN FN.FLD_CD = 2 THEN FN.AMOUNT END) as LN2, 
     MAX(CASE WHEN FN.FLD_CD = 3 THEN FN.AMOUNT END) as LN3 
FROM ASSESSMENT A JOIN 
    FINANCE FN 
    ON A.CLIENT_ID = FN.CLIENT_ID 
WHERE FN.FLD_CD IN ('1', '2', '3') 
    (other irrelevant stuff) 
GROUP BY A.CLIENT_ID; 

Примечания:

  • Никогда использовать запятые в предложении FROM. Всегда использовать явно JOIN синтаксис.
  • Решение по вашему запросу - это предложение GROUP BY вместе с функциями агрегации в предложении SELECT.
  • Возможно, вам понадобится SUM() вместо MAX(), если для клиента существует несколько кодов с одинаковым значением.
  • Как запрос написано, вам не нужен JOIN (просто использовать f.CLIENT_ID для SELECT и GROUP BY. Я предполагаю, что JOIN нужен для других вещей, а не в запросе.
+0

Fantastic! Спасибо. – Ardia

Смежные вопросы