2015-07-28 39 views
3

我有我的數據庫中的表,它看起來像(在表可以有相同的元組)的重複:如何消除同排

+-------------+---------+--------+ 
| ProductName | Status | Branch | 
+-------------+---------+--------+ 
| P1   | dead |  1 | 
| P1   | dead |  2 | 
| P1   | dead |  2 | 
| P2   | expired |  1 | 
+-------------+---------+--------+ 

我想要顯示的結果後爲(科屬性是動態的):

+-------------+---------+--------+ 
| ProductName | Branch 1|Branch 2| 
+-------------+---------+--------+ 
| P1   | dead | dead| 
| P2   | expired |  OK | 
+-------------+---------+--------+ 

後一些幫助,我想出了以下解決方案:

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
CONCAT(
    'GROUP_CONCAT(case when branch = ''', 
    branch, 
    ''' then status ELSE NULL end) AS ', 
    CONCAT('Branch',branch) 
) 
) INTO @sql 
FROM Table1; 

SET @sql = CONCAT('SELECT productName, ', @sql, ' 
       FROM Table1 
       GROUP BY productName'); 


PREPARE stmt FROM @sql; 
EXECUTE stmt; 

中示出的結果是這樣的:

+-------------+---------+-----------+ 
| productName | Branch1 | Branch2 | 
+-------------+---------+-----------+ 
| p1   | dead | dead,dead | 
| p2   | expired | (null) | 
+-------------+---------+-----------+ 

SQL Fiddle
我現在想要的是當狀態爲空時顯示產品狀態爲「OK」而不是null,並且如果表中存在重複的產品,則不需要連接狀態..嘗試了很多,但無法整理。提前致謝。

回答

2

這是一個有點棘手,因爲會有repetion如果狀態是一樣的,所以聚結必須在GROUP_CONCAT

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'COALESCE(GROUP_CONCAT(DISTINCT case when branch = ''', 
     branch, 
     ''' then status end),''OK'') AS ', 
     CONCAT('Branch',branch) 
    ) 
) INTO @sql 
FROM Table1; 

SET @sql = CONCAT('SELECT productName, ', @sql, ' 
        FROM Table1 
        GROUP BY productName'); 



PREPARE stmt FROM @sql; 
EXECUTE stmt; 

Link

+1

那偉大@Minhai外..我之前嘗試了COALESCE(),但是把它放在錯誤的地方:)。 「分支」這個詞與分支的名字連接在一起..我可以刪除它......我只需要在表頭中的分支名稱。我已經嘗試過,但無法整理出來。再次感謝。 – Hasnain