2013-08-28 1 views
0

새로운 Iam stackoverflow에서, 나는 subj 할려고 몇 가지 문제가 있습니다. 보고서.Mysql 크로스 탭 유효성 확인

표 예

 
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 

주요 합병증 보고서

필요한

우리가 고객의 경우 객담을 고객의 유효성을 검사 할 필요가 또는 개의 다른의 부가 요소를하지 않은 것입니다. 어떤 도움을 이해할 수있을 것이다

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 ; 

그리고 여기 SQLFiddle 데모

입니다

CALL sp_report(); 

처럼 사용