2016-02-22 113 views
0

我有以下數據使用數據透視表查詢?

WITH got_grp AS 
(
SELECT '1111' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1111' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1112' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '1' AS AMOUNT FROM dual UNION ALL 
SELECT '1113' AS LINE_NBR, '122' AS AMOUNT_ID, 'A' AS I_N, '12' AS AMOUNT FROM dual UNION ALL 
SELECT '1114' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '14.4' AS AMOUNT FROM dual UNION ALL 
SELECT '1116' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '11' AS AMOUNT FROM dual UNION ALL 
) 

我想找回總計爲一個AMOUNT_ID特定1-N。 我希望查詢如果存在的行的所有amounts_id(121122522)返回值,並且如果總的 量是大於30(AMOUNT_ID_121 + AMOUNT_ID_122 + AMOUNT_ID_522> 30)

例如:

I_N | AMOUNT_ID_121 | AMOUNT_ID_122 | AMOUNT_ID_522

A | 11 | 12 | 15.4

你能幫助我嗎?

+0

使用'SUM'特定'AMOUNT_ID'值(121122522)你'PIVOT'子句中聚合函數。然後,您可以對數量進行「SUM」處理,將'GROUP BY'處理爲您的'I_N'列。 – AndrewMcCoist

回答

0
WITH got_grp AS 
(
SELECT '1111' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1111' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1112' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '1' AS AMOUNT FROM dual UNION ALL 
SELECT '1113' AS LINE_NBR, '122' AS AMOUNT_ID, 'A' AS I_N, '12' AS AMOUNT FROM dual UNION ALL 
SELECT '1114' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '14,4' AS AMOUNT FROM dual UNION ALL 
SELECT '1116' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '11' AS AMOUNT FROM dual 
) 
select LINE_NBR, I_N, AMOUNT_ID_522, AMOUNT_ID_121, AMOUNT_ID_122 
from(
select LINE_NBR, AMOUNT_ID, I_N, AMOUNT 
FROM got_grp) 
PIVOT(SUM(AMOUNT) FOR AMOUNT_ID IN ('522' AS AMOUNT_ID_522, '121' AS AMOUNT_ID_121, '122' AS AMOUNT_ID_122) 
) 
WHERE 
NVL(AMOUNT_ID_522,0)+NVL(AMOUNT_ID_121,0)+NVL(AMOUNT_ID_122,0)>30; 
-1
WITH got_grp AS 
(
SELECT '1111' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1111' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '0' AS AMOUNT FROM dual UNION ALL 
SELECT '1112' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '1' AS AMOUNT FROM dual UNION ALL 
SELECT '1113' AS LINE_NBR, '122' AS AMOUNT_ID, 'A' AS I_N, '12' AS AMOUNT FROM dual UNION ALL 
SELECT '1114' AS LINE_NBR, '522' AS AMOUNT_ID, 'A' AS I_N, '14.4' AS AMOUNT FROM dual UNION ALL 
SELECT '1116' AS LINE_NBR, '121' AS AMOUNT_ID, 'A' AS I_N, '11' AS AMOUNT FROM dual 
) 
select * 
    from got_grp PIVOT(SUM(AMOUNT) FOR AMOUNT_ID IN('522' AS AMOUNT_ID_522, 
               '121' AS AMOUNT_ID_121, 
               '122' AS AMOUNT_ID_122)) 
WHERE AMOUNT_ID_522 IS NOT NULL 
    AND AMOUNT_ID_121 IS NOT NULL 
    AND AMOUNT_ID_122 IS NOT NULL 
    AND AMOUNT_ID_522 + AMOUNT_ID_121 + AMOUNT_ID_122 > 30;