2014-06-11 60 views
0

對於下面的Table結構,我無法構建所需的輸出,不確定是否需要應用轉置,但我沒有很強的知識。 最後給出了用於表創建和數據插入的SQL腳本。Oracle SQL查詢 - 需要幫助

輸出格式應如上所示,輸出結果的ID_MAX_VAL應爲主源表中每個製造商國家組合的ID的最大值。我需要獲取每個製造商國家/地區組合的最大ID,並顯示/使用它們發送報告。

輸出:

MANUFACTURER COUNTRY  ID_MAX_VAL 
-------------------------------------- 
NISSAN   USA   10 
NISSAN   UK   30 
HONDA   USA   80 
HONDA   UK   70 

注:這是一個測試數據和表結構來模擬實際的業務需求。

與我剛纔提到的表格類似的視圖是我們唯一可以訪問的東西,並且可以作爲我們的唯一來源。只能使用它。

SQL腳本:

CREATE TABLE TB_TEST_01 
(
    ID NUMBER(6) NOT NULL 
, PARAM_NM VARCHAR2(200) NOT NULL 
, PARAM_VAL VARCHAR2(200) 
); 
/

INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (10, 'MANUFACTURER', 'NISSAN'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (10, 'COUNTRY', 'USA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (30, 'MANUFACTURER', 'NISSAN'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (30, 'COUNTRY', 'UK'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (20, 'MANUFACTURER', 'NISSAN'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (20, 'COUNTRY', 'UK'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (50, 'MANUFACTURER', 'HONDA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (50, 'COUNTRY', 'USA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (60, 'MANUFACTURER', 'HONDA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (60, 'COUNTRY', 'USA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (80, 'MANUFACTURER', 'HONDA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (80, 'COUNTRY', 'USA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (70, 'MANUFACTURER', 'HONDA'); 
INSERT INTO TB_TEST_01 (ID, PARAM_NM, PARAM_VAL) VALUES (70, 'COUNTRY', 'UK') 
; 
/
COMMIT; 
+0

不要使用';'**和**'/'定期DDL或DML語句:HTTP://計算器.com/questions/1079949/sql-the-semicolon-or-the-slash/10207695#10207695 –

回答

1

在沒有標準化的設計的情況下,我們可以自行參加表,就像下面的一樣。

SELECT T1.PARAM_VAL AS MANUFACTURER, 
     T2.PARAM_VAL AS COUNTRY, 
     MAX(T1.ID) AS MAX_ID_VAL 
FROM TB_TEST_01 T1,TB_TEST_01 T2 
WHERE 
     T1.ID = T2.ID 
    AND T1.PARAM_NM='MANUFACTURER' 
    AND T2.PARAM_NM='COUNTRY' 
GROUP BY 
    T1.PARAM_VAL,T2.PARAM_VAL 
+0

感謝OracleUser! – NiCKz

+0

對於此測試表和數據,它工作正常。 但是,當我想要找出特定製造商與國家/地區組合的最大ID時,考慮到我的真實表格中包含大量數據,它需要很長時間。 任何方式進一步調整它? 比方說,我只是想獲得本田美國的最大ID。 – NiCKz

+0

如果可能或者最壞的情況下,通過param_nm對錶進行分區(按paranam名稱,參數值排序),這本身應該會給你很大的改進。當oracle能夠過濾出廠商(實際情況)時,其他操作應該順利進行。我希望看到實際的解釋計劃。 –

0

試試這個

CREATE TABLE TB_TEST_01 
(
    ID NUMBER(6) NOT NULL 
, MANUFACTURER VARCHAR2(200) NOT NULL 
, COUNTRY VARCHAR2(200) 
); 
/

INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (10, 'NISSAN', 'USA'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (20, 'NISSAN', 'UK'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (30, 'NISSAN', 'UK'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (50, 'HONDA', 'USA'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (60, 'HONDA', 'USA'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (70, 'HONDA', 'UK'); 
INSERT INTO TB_TEST_01 (ID, MANUFACTURER, COUNTRY) VALUES (80, 'HONDA', 'USA'); 

COMMIT; 
/

和出把

SELECT manufacturer, country,MAX(ID) id_max FROM TB_TEST_01 
GROUP BY manufacturer,country; 
+0

感謝Kitezzz,但我沒有選擇更改表結構。這是我必須使用的觀點,並且需要解決方案。 – NiCKz

2

可以使用PIVOT功能也:

select M_PARAM_VAL MANUFACTURER, C_PARAM_VAL COUNTRY, max(ID) ID_MAX_VAL 
    from TB_TEST_01 
pivot (min(PARAM_VAL) as PARAM_VAL for (PARAM_NM) in ('MANUFACTURER' as M, 'COUNTRY' as C)) 
group by M_PARAM_VAL, C_PARAM_VAL; 

輸出:

| MANUFACTURER | COUNTRY | ID_MAX_VAL | 
|--------------|---------|------------| 
|  HONDA |  UK |   70 | 
|  NISSAN |  USA |   10 | 
|  NISSAN |  UK |   30 | 
|  HONDA |  USA |   80 | 
+0

謝謝!工作就像一個魅力.. PIVOT很好..仍然需要進一步瞭解..我會通過Oracle文檔.. :) – NiCKz

+0

使用上面的PIVOT查詢,我怎麼得到最大ID讓我們說本田美國?我從來沒有使用過PIVOT,所以很困惑。 我的真實表格中包含大量數據...因此需要確保我選擇最佳性能查詢。 – NiCKz

+0

'PIVOT'函數使用聚合函數,'min(PARAM_VAL)'用於滿足這個條件。 'PIVOT'將數據從行轉換爲列,或者可以說轉置,然後任務變得更容易找到'ID'的最大值。通過從選擇列表和「GROUP BY」子句中刪除「max(ID)ID_MAX_VAL」來了解更多信息。 – San

0

@San @OracleUser 感謝所有幫助,並與不同類型的解決方案.. PIVOT ,SELF JOIN .. :) (我是PIVOT的新手,仍然需要了解它是如何工作的)

我用它像這樣得到一個特定製造商的詳細信息:

SELECT T1.PARAM_VAL AS MANUFACTURER, 
     T2.PARAM_VAL AS COUNTRY, 
     MAX(T1.ID) AS MAX_ID_VAL 
FROM TB_TEST_01 T1,TB_TEST_01 T2 
WHERE 
     T1.ID = T2.ID 
    AND T1.PARAM_NM='MANUFACTURER' 
    AND T2.PARAM_NM='COUNTRY' 
    AND T1.PARAM_VAL='HONDA' 
GROUP BY 
    T1.PARAM_VAL,T2.PARAM_VAL;