2011-12-15 42 views
0

我的數據集不完全像EAV格式,但它有點類似;這裏的數據:與rows-to-col(EAV到關係)類似 - 請查詢SQL查詢

original data

在我需要的格式如下:

data format needed

因爲我需要在上述格式的數據每EN_NO組。如果在EN_NO> 1上組,那麼Respective產品密鑰應轉到Respective產品列否則不是(例如EN_NO 4和5)。

我希望我很清楚。數據位於Qracle表中,請建議查詢以我需要的格式獲取數據。

感謝, 普拉卡什

回答

0

我會強烈建議改變你的表結構。目前,您將兩條信息綁定到一個字段中。這是一種SQL反模式,破壞了Oracle用戶某些優化的能力。請考慮將「PROD_KEY」分成兩個字段(PRODUCT_TYPE = Prod_A等)(SUB_PRODUCT_ID = 1,2,3等)。或者,爲了減少整個數據庫的潛在變化,只需將PRODUCT_TYPE添加到當前表中即可。


也就是說,使用當前的結構......

SELECT 
    EN_NO, 
    PROD_KEY, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_A') THEN PROD_KEY ELSE NULL END AS Prod_A, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_B') THEN PROD_KEY ELSE NULL END AS Prod_B, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_C') THEN PROD_KEY ELSE NULL END AS Prod_C, 
    PROD_QTY 
FROM 
    yourTable 

當你明確知道你需要作爲輸出哪些列這工作。如果你需要代碼來適應Prod_D等,那麼你需要編寫代碼來編寫代碼(動態SQL)。

0

你顯示的是一個數據透視表。如果你想要一個能夠自動添加與表格中不同數據值相對應的列的查詢,那麼你的運氣不好。 SQL不支持這個;列在讀取表中的任何數據值之前,必須知道並在您準備查詢時修復列。

要做到這一點,你需要得到不同prod_key值的列表(或向上串到:字符):

SELECT DISTINCT LEFT(PROD_KEY, 6) FROM yourTable; 

,然後編寫應用代碼打開值列表中成系列正如@Dems所提到的,動態SQL語句中的列表達式。

另一種選擇是獲取表中存在的原始數據,然後編寫遍歷它的應用程序代碼,並將它一次一組地分組爲表格報告中的一個數據值。

無論哪種方式,除非您已經知道要獲取的不同prod_key類型的列表,否則您需要編寫應用程序代碼。