2013-08-28 3 views
0

Iam new в stackoverflow, у меня есть некоторые проблемы, пытающиеся сделать subj. отчет.Mysql Crosstab, подтверждающий существование

Таблица Пример

 
Group Client Atribute 
Group1 Client1 Atribute1 
Group1 Client1 Atribute1 
Group1 Client2 Atribute2 
Group2 Client3 Atribute1 
Group3 Client4 Atribute2 
Group3 Client5 Atribute2 
Group3 Client5 Atribute2 
Group3 Client6 Atribute3 

Примечание: Клиент и группы столбцов будет repetead в этом примере.

Необходим отчет

 
Group Client Atribute1 Atribute2 Atribute3 
Group1 Client1 Yes   no  no 
Group1 Client2 no   yes  no 
Group2 Client3 yes   no  no 
Group3 Client4 no   yes  no 
Group3 Client5 no   yes  no 
Group3 Client6 no   no  yes 

Основная сложность заключается в том, что нам нужно для проверки клиента клиентом, если HAVER или не в Diferent atributes.

Я застрял в самом начале, я думал, что-то вроде этого:

SELECT 
group, 
client, 
CASE WHEN EXISTS 
(SELECT client FROM table 
    WHERE client IN (SELECT client FROM table 
    WHERE Atribute = 3) -- The problem is that since there is an attribute for one of the clients the subquery result true and will go to the "THEN" dor all the clients. 
) THEN 'Yes' ELSE 'No' END AS Atribute3, 
FROM 
table 
GROUP BY group, client 

Любая помощь будет оценена. Извините мой английский! Лучшие регги.

ответ

0

Вы можете сделать это, как это с динамическим SQL

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('MAX(CASE WHEN atribute = ''', 
       atribute, 
       ''' THEN ''yes'' ELSE ''no'' END) ', 
       atribute)) 
    INTO @sql 
    FROM table1; 

SET @sql = CONCAT('SELECT `group`, client, ', @sql, ' 
        FROM table1 
        GROUP BY `group`, client'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Выход:

 
| GROUP | CLIENT | ATRIBUTE1 | ATRIBUTE2 | ATRIBUTE3 | 
|--------|---------|-----------|-----------|-----------| 
| Group1 | Client1 |  yes |  no |  no | 
| Group1 | Client2 |  no |  yes |  no | 
| Group2 | Client3 |  yes |  no |  no | 
| Group3 | Client4 |  no |  yes |  no | 
| Group3 | Client5 |  no |  yes |  no | 
| Group3 | Client6 |  no |  no |  yes | 

Вот SQLFiddle демо

Чтобы упростить вещи на вызывающем конце вы можете обернуть его в хранимую процедуру

DELIMITER $$ 
CREATE PROCEDURE sp_report() 
BEGIN 
    SET @sql = NULL; 

    SELECT GROUP_CONCAT(DISTINCT 
      CONCAT('MAX(CASE WHEN atribute = ''', 
        atribute, 
        ''' THEN ''yes'' ELSE ''no'' END) ', 
        atribute)) 
    INTO @sql 
    FROM table1; 

    SET @sql = CONCAT('SELECT `group`, client, ', @sql, ' 
        FROM table1 
        GROUP BY `group`, client'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END$$ 
DELIMITER ; 

И затем использовать его как

CALL sp_report(); 

Вот SQLFiddle демо

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