2017-09-05 3 views
2

Databasemerge SQL/Zeileninformationen in Spalten

Ich habe eine Datenbank, wie in der Abbildung zu transformieren. Lassen Sie uns folgende Daten als Beispiel verwenden:

Fertigungsauftrag Tabelle:

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

FAILUREREPORT Tabelle:

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 

FAILURECODE Tabelle:

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

ich folgende Abfrage habe, die die Arbeit auf halben Weg macht:

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 

Es gibt:

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. 

würde jedoch anstelle von 3 Zeilen, Ich mag die Symptom haben, Ursache und Lösung in einer Zeile aufgeführt, wie folgt:

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

Wie verwende ich Pivot-Funktion, um die Zeilen in Spalten umzuwandeln, wenn es möglich ist? Ich bin auch offen für jede andere Lösung, die zum gewünschten Ergebnis führt. Die Datenbank, in der ich arbeite, ist Oracle DB, während meine Spiel-/Testumgebung MySQL ist. Ich bin mir bewusst, dass Pivot nicht in MySQL verwendet werden kann, aber es gibt Möglichkeiten, die es durch Aggregation und Gruppierung gibt.

Antwort

2

Sie benötigen eine Fallanweisung. Versuchen Sie, diese

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

Korrigierte alle Bedenken. –

+0

Sie müssen noch 'MIN (CASE WHEN TYPE = 'PROBLEM' THEN C.DESCRIPTION) als PROBLEM END 'zu' MIN (CASE WHEN TYPE =' PROBLEM 'DANN C.DESCRIPTION END) ALS PROBLEM' ändern. – markusk

+0

MySQL schreibt außerdem vor, dass Sie 'MIN (...)' anstelle von 'MIN (...)' (kein Leerzeichen zwischen 'MIN' und' (')) schreiben und' AS WO_DESC' aus dem Verzeichnis entfernen muss "GROUP BY" -Klausel – markusk

1

Verwendung Subqueries:

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

Unterabfragen können einige Leistungsprobleme haben –

+0

Diese Abfrage gibt auch das gleiche Ergebnis zurück.Eine schöne Lösung.Thanks! – gopak86

Verwandte Themen