2017-09-05 60 views
2

DatabaseSQL合併/將行信息轉換爲列

我有一個數據庫,如圖所示。讓我們用下面的數據爲例:

工單表:

WONUM (PK) | WORKTYPE | STATUS | DESCRIPTION 
1234   URGENT  OPEN  Inv. work X. 

FAILUREREPORT表:

FAILUREREPORTID (PK) | WONUM | FAILURECODE | ASSETNUM | TYPE 
5678     1234 SYMPT1347  DT-JA-123 Problem 
5679     1234 WA4521  DT-JA-123 Cause 
5680     1234 SOL1672  DT-JA-123 Solution 

失敗代碼表:

FAILURECODEID (PK) | FAILURECODE | DESCRIPTION 
345     SYMPT1347  Symptom X. 
346     WA4521  Cause Y. 
347     SOL1672  Solution Z. 

我有以下查詢,這不會工作中途:

SELECT F.WONUM, W.DESCRIPTION AS WO_DESC, W.STATUS, F.ASSETNUM, F.TYPE, C.DESCRIPTION AS FCODE_DESC 
FROM WORKORDER W 
INNER JOIN FAILUREREPORT F ON F.WONUM = W.WONUM 
INNER JOIN FAILURECODE C ON F.FAILURECODE = C.FAILURECODE 
WHERE W.WORKTYPE = 'URGENT' AND W.STATUS <> 'CANCELLED' 
ORDER BY F.WONUM ASC, F.TYPE ASC 

它返回:

WONUM | WO_DESC    | STATUS | ASSETNUM | TYPE | FCODE_DESC 
1234 Inv. work X.   OPEN  DT-JA-123 PROBLEM Symptom X. 
1234 Inv. work X.   OPEN  DT-JA-123 CAUSE  Cause Y. 
1234 Inv. work X.   OPEN  DT-JA-123 SOLUTION Solution Z. 

然而,不是3行,我想有症狀,原因解決方案列在一行,如下所示:

WONUM | WO_DESC  | STATUS | ASSETNUM | PROBLEM | CAUSE | SOLUTION 
1234 Inv. work X. OPEN  DT-JA-123 Symptom X. Cause Y. Solution Z. 

如何使用pivot函數將行轉換爲列(如果可能的話)?我也接受任何其他解決方案,導致預期的結果。 我操作的數據庫是Oracle DB,而我的操場/測試環境是MySQL。我知道這個pivot不能在MySQL中使用,但是通過聚合和分組可以解決這個問題。

回答

2

您需要一個case語句。試試這個

SELECT F.WONUM, 
     W.DESCRIPTION AS WO_DESC, 
     W.STATUS, 
     F.ASSETNUM, 
     MIN (CASE WHEN TYPE = 'PROBLEM' THEN C.DESCRIPTION END) AS PROBLEM, 
     MIN (CASE WHEN TYPE = 'CAUSE' THEN C.DESCRIPTION END) AS CAUSE, 
     MIN (CASE WHEN TYPE = 'SOLUTION' THEN C.DESCRIPTION END) AS SOLUTION 
FROM WORKORDER W 
INNER JOIN FAILUREREPORT F ON F.WONUM = W.WONUM 
INNER JOIN FAILURECODE C ON F.FAILURECODE = C.FAILURECODE 
WHERE W.WORKTYPE = 'URGENT' 
AND W.STATUS <> 'CANCELLED' 
GROUP BY F.WONUM, 
     W.DESCRIPTION, 
     W.STATUS, 
     F.ASSETNUM 
ORDER BY F.WONUM ASC 
+0

更正的種種顧慮。 –

+0

您仍然需要將'MIN(CASE WHEN TYPE ='PROBLEM'THEN C.DESCRIPTION)as PROBLEM END'改爲MIN(CASE WHEN TYPE ='PROBLEM'THES C.DESCRIPTION END)as problem「。 – markusk

+0

此外,MySQL要求你編寫'MIN(...)'而不是'MIN(...)'(MIN和'(')之間不允許有空格,並且'AS WO_DESC'必須從'GROUP BY'條款 – markusk

1

使用子查詢:

SELECT w.wonum, w.description AS wo_desc, w.status, 
    (SELECT assetnum FROM FAILUREREPORT WHERE wonum = w.wonum LIMIT 1) assetnum, 
    (SELECT description 
    FROM FAILUREREPORT JOIN FAILURECODE USING(failurecode) 
    WHERE type = 'PROBLEM' AND wonum = w.wonum) problem,  
    (SELECT description 
    FROM FAILUREREPORT JOIN FAILURECODE USING(failurecode) 
    WHERE type = 'CAUSE' AND wonum = w.wonum) cause,  
    (SELECT description 
    FROM FAILUREREPORT JOIN FAILURECODE USING(failurecode) 
    WHERE type = 'SOLUTION' AND wonum = w.wonum) solution 
FROM WORKORDER w 
WHERE w.worktype = 'URGENT' AND w.status <> 'CANCELLED' 
ORDER BY wonum ASC 
+0

使用子查詢可能會有一些性能問題。 –

+0

此查詢也返回相同的結果。一個很好的解決方案,謝謝! – gopak86