2015-07-28 2 views
3

У меня есть таблица в моей базе данных, которая выглядит как (там могут быть одинаковыми кортежей в таблице):Как устранить повторение одних и тех же строк

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

Я хочу, чтобы показать результат после того, как в (атрибут Branch является динамическим):

+-------------+---------+--------+ 
| 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.
Теперь я хочу показать статус продукта как «ОК», а не null, когда статус равен нулю, а также не нужно конкатенировать статус, если в таблице повторяется повторение продукта. отсоритровать. Заранее спасибо.

ответ

2

Это немного сложнее, потому что будет repetion если статусы одинаковы, поэтому COALESCE должен быть на внешней стороне 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

Thats большой @Minhai .. я ранее пытался COALESCE(), но поставил его в неправильное место :). Слово «Ветвление» объединяется с именем «Ветви». Как я могу его удалить ... Мне нужно только имя ветки из таблицы в заголовке. Я попытался, но не смог разобрать его. Спасибо снова. – Hasnain

Смежные вопросы