2017-09-05 45 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