2017-10-25 10 views
1

저는 다소 신참 한 SQL 신참이지만 3 개의 테이블 사이에 피벗을 작성하려고합니다. 나는 아래의 쿼리를 가지고 있으며 그것은 MAX 호출 외에도 완벽하게 작동한다. 이로 인해 기본값보다 작은 값이 무시됩니다. 나는 아래 테이블의 스크린 샷을 가지고있다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?MySQL Dynamic Pivot 테이블이 적절한 결과를 제공하지 않음

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT(
      'MAX(IF(cc.company_config_key_id = ', cck.id, ', cc.config_value, \'', cck.default, '\')) AS ', cck.company_config_key 
     ) 
    ) INTO @sql 
    FROM company_config cc 
    LEFT JOIN company_config_key cck 
    ON cck.id = cc.company_config_key_id; 
SET @sql = CONCAT('SELECT co.id, co.name, ', @sql, ' FROM companies co LEFT JOIN company_config cc ON cc.company_id = co.id GROUP BY co.id'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 

회사 :

Companies table

company_config_key :

company_config_key table

company_config :

company_config table

(회사 1과 2의 보조 색을 설정해야합니다)

결과 :

query result

답변

0

내가 그냥 문을 NULL로하면 내부를 설정했고, 다음 IFNULL에 최대 문을 감싸 밝혀 .

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT('IFNULL(MAX(IF(cc.company_config_key_id = ', cck.id, ', cc.config_value, NULL)), \'', cck.default, '\') AS ',cck.company_config_key) 
    ) INTO @sql 
    FROM company_config cc 
    LEFT JOIN company_config_key cck 
    ON cck.id = cc.company_config_key_id; 
SET @sql = CONCAT('SELECT co.id, co.name, ', @sql, ' FROM companies co LEFT JOIN company_config cc ON cc.company_id = co.id GROUP BY co.id'); 
SELECT @sql; 
PREPARE stmt FROM @sql; 
EXECUTE stmt;