【问题标题】:Split Values into several other columns将值拆分为其他几列
【发布时间】:2018-05-02 07:27:00
【问题描述】:

代码:

CREATE TABLE table1 (
  day DATE,
  name VARCHAR(40)
  );
INSERT INTO table1 (day, name)
VALUES 
('2018-01-01', 'test1'),
('2018-01-01', 'test2'),
('2018-01-01', 'example'),
('2018-01-01', 'somevalue'),
('2018-01-02', 'test3'),
('2018-01-03', 'test4');

我想将结果拆分为:

day - name1 - name2 - namex  
DATE - value - value - value 

而不是在我选择数据时复制日期。

预期结果:

day - name - name - name - name ...
2018-01-01 - test1 - test2 - example - somevalue
2018-01-02 - NULL - NULL - NULL - NULL - test3

SQL FIDDLE

【问题讨论】:

  • 请将示例表数据和预期结果也作为格式化文本提供。
  • 由于name 的长度可变,这是不可能的。你应该选择GROUP BYGROUP_CONCAT。检查这个Fiddle
  • 认真考虑处理应用代码中数据显示的问题
  • @Strawberry 你的意思是像php这样的另一种语言?
  • 我已经编辑了示例表数据。现在向我们展示预期的结果。

标签: mysql sql select sqlfiddle


【解决方案1】:

您可以通过动态 sql 执行此操作,首先找到不同的名称值,然后围绕它们构建其余代码,例如

给定

MariaDB [sandbox]> select * from t;
+------------+-----------+
| day        | name      |
+------------+-----------+
| 2018-01-01 | test      |
| 2018-01-01 | test      |
| 2018-01-01 | example   |
| 2018-01-01 | somevalue |
| 2018-01-02 | test      |
| 2018-01-03 | test      |
+------------+-----------+
6 rows in set (0.00 sec)

set @sql = concat('select day, ',
(select group_concat(maxstr)
from
(select concat('max(case when name = ', char(39),name,char(39),' then  name else null end) as ', concat('name',@rn:=@rn+1)) maxstr
from  
(select distinct name from t) t,(select @rn:=0) rn
) s
)
,
' from t group by day')
;

构建此代码

select day, max(case when name = 'test' then  name else null end) as name1,
        max(case when name = 'example' then  name else null end) as name2,
        max(case when name = 'somevalue' then  name else null end) as name3 
from t group by day;

运行时会产生这个结果

+------------+-------+---------+-----------+
| day        | name1 | name2   | name3     |
+------------+-------+---------+-----------+
| 2018-01-01 | test  | example | somevalue |
| 2018-01-02 | test  | NULL    | NULL      |
| 2018-01-03 | test  | NULL    | NULL      |
+------------+-------+---------+-----------+
3 rows in set (0.00 sec)

使用动态 sql 的优点是它很容易忘记任何新值都会被代码捕获。不过要小心 group_concat 限制。

像这样执行动态sql-

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt; 

【讨论】:

    【解决方案2】:

    在此代码中,您按日期和名称分组并按升序对其进行排序

    SELECT * FROM table1
    group by day, name
    ORDER BY day ASC;
    

    查看image

    【讨论】:

    • 不完全是 OP 的要求。
    【解决方案3】:

    您可以使用 group by 和 group concat 来做到这一点,如下所示

    select t.day,left(t.data,length(t.data)-1)
    from
    (
    SELECT day,replace(group_concat(concat(name,'-')),',','')as data
    FROM table1
    group by day
      )t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多