首页 > 解决方案 > 多组 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语句应该是什么?可能是愚蠢的,但我真的无法理清结果。请帮帮我。

标签: phpmysqlsql

解决方案


虽然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;

sqlfiddle


推荐阅读