【问题标题】:nesting and unnesting嵌套和取消嵌套
【发布时间】:2020-08-21 21:29:42
【问题描述】:

我有一张像下面这样的表格

name                value
-----        |      ------
rami         |      2
rami         |      3
rami         |      4

sam                 5
sam                 6

我想以某种方式对其进行旋转以获得此结果

Rami      sam
-----     -----
2,3,4     5,6

【问题讨论】:

  • 请。在发布之前验证预览。更重要的是,展示你的努力、你的研究、你遇到问题的地方,并描述那个特定的方面。还要标记您正在使用的数据库引擎。
  • 您使用的是哪种 DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 感谢您的数据库管理系统 MYSQL

标签: mysql sql string-aggregation


【解决方案1】:

你需要一个更复杂的数据透视表

用户定义的变量@sql 获取名称并添加值 外部选择由@sql2

CREATE TABLE name_val
    (`name` varchar(4), `value` int)
;
    
INSERT INTO name_val
    (`name`, `value`)
VALUES
    ('rami', 2),
    ('rami', 3),
    ('rami', 4),
    ('sam', 5),
    ('sam', 6)
;
SET @sql = NULL;
SET @sql2 = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('GROUP_CONCAT(IF(s.`name` = "', `name`,'", `value`,"")) AS ',name)
              ) INTO @sql
FROM name_val;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('MAX(', `name`,') AS ',name)
              ) INTO @sql2
FROM name_val;

SET @sql = CONCAT('SELECT ',@sql2,' FROM (SELECT ', @sql, ' 
                  FROM name_val s
                 GROUP BY s.`name`
                 ORDER BY s.`name`) t1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
拉米 |山姆 :---- | :-- 2,3,4 | 5,6

db小提琴here

【讨论】:

    【解决方案2】:

    只使用条件聚合:

    select group_concat(case when name = 'Rami' then value end order by value) as rami,
           group_concat(case when name = 'Sam' then value end order by value) as sam
    from t;
    

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2020-11-11
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多