php - 多组 SQL 数据
问题描述
我在数据库中有一个类似的表:
id desg sr per 1 deg-1 高约翰史密斯 2 deg-2 高彼得帕克 3 deg-3 低 John Smith 4 deg-4高迈克 5 deg-5 高彼得帕克 6 deg-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
结果:
| 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;
推荐阅读
- html - 我将 YouTube 嵌入代码放在我的网站中,但我无法禁用共享按钮帮助我解决这个问题
- angular - 从本地存储获取服务器 URL 以在 Ionic(Angular) 中调用 API
- reactjs - Reactjs - 升级到版本 17.0.0
- audio - 尝试记录时纯数据冻结
- unicode - vbscript filesystemobject 如何对字符进行编码?
- scala - 按顺序合并案例类
- ios - 设备上的 iPhone 12 Pro 调试挂起
- python - Scrapy meta 或 cb_kwargs 不能在多个方法之间正确传递
- ios - 我可以在 iphone12 上获取 PHAsset / AVAsset 是 hdr 视频/杜比视觉吗?
- r - 将tibble列中的嵌套列表提取到其他列