我在数据库中有一个类似的表:
根据id设计sr
高约翰·史密斯
2 desg-2高彼得·帕克
3低约翰史密斯
4 desg-4高麦克
5 desg-5高彼得·帕克
6低约翰史密斯
现在我想这样整理数据:
名称计数(desg)高低
约翰·史密斯03 01 02
彼得·帕克02 00 02
迈克01 01 00
SQL语句应该是什么?可能很傻,但我真的搞不清结果。请帮帮我。
最佳答案
虽然mysql不支持pivot
,但是可以尝试使用条件聚合函数
CREATE TABLE T(
ID INT,
desg VARCHAR(50),
sr VARCHAR(50),
per VARCHAR(50)
);
INSERT INTO T VALUES (1,'desg-1','high','John Smith');
INSERT INTO T VALUES (2,'desg-2','high','Peter Parker');
INSERT INTO T VALUES (3,'desg-3','low','John Smith');
INSERT INTO T VALUES (4,'desg-4','high','Mike');
INSERT INTO T VALUES (5,'desg-5','high','Peter Parker');
INSERT INTO T VALUES (6,'desg-6','low','John Smith');
问题1:
SELECT per,
COUNT(desg),
sum(CASE WHEN sr= 'high' THEN 1 else 0 END) high,
sum(CASE WHEN sr= 'low' THEN 1 else 0 END) low
FROM T
GROUP BY per
Results:
| per | COUNT(desg) | high | low |
|--------------|-------------|------|-----|
| John Smith | 3 | 1 | 2 |
| Mike | 1 | 1 | 0 |
| Peter Parker | 2 | 2 | 0 |
如果要动态创建列,可以使用动态透视。
创建动态创建SQL并执行它。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN sr= ''',
sr,
''' THEN 1 else 0 END) ',
sr
)
) INTO @sql
FROM T;
SET @sql = CONCAT('SELECT per,
COUNT(desg), ', @sql, '
FROM T
GROUP BY per');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
sqlfiddle
关于php - 通过SQL数据进行多个分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52130598/