MySQL 没有 PIVOT 函数,但您可以使用带有CASE
表达式的聚合函数将行转换为列。
如果您的数量或phone_name
值有限,则可以对查询进行硬编码:
select account_id,
sum(case when phone_name = 'samsung M360' then 1 else 0 end) SamsungM360,
sum(case when phone_name = 'HTC One' then 1 else 0 end) HTCOne,
sum(case when phone_name = 'LG Optimus' then 1 else 0 end) LGOptimus,
sum(case when phone_name = 'Novatel' then 1 else 0 end) Novatel
from yt
group by account_id;
请参阅SQL Fiddle with Demo。
但是如果这些值是未知的,那么您将需要使用准备好的语句来生成动态 SQL:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN phone_name = ''',
phone_name,
''' THEN 1 else 0 END) AS `',
phone_name, '`'
)
) INTO @sql
FROM yt;
SET @sql
= CONCAT('SELECT account_id, ', @sql, '
from yt
group by account_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请参阅SQL Fiddle with Demo。两个查询都给出了结果:
| ACCOUNT_ID | SAMSUNG M360 | HTC ONE | LG OPTIMUS | NOVATEL |
--------------------------------------------------------------
| 0 | 1 | 0 | 0 | 0 |
| 12 | 0 | 1 | 0 | 1 |
| 58 | 0 | 0 | 1 | 0 |
注意:GROUP_CONCAT()
默认值为 1024 作为生成的字符串的长度。因此,group_concat_max_length
如果您的字符串太长,您可能需要更改会话设置。