微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将每次出现的选择都放入新列SQL

如何解决将每次出现的选择都放入新列SQL

我有一个sql数据库,其中包含一个由4列组成的简单表。这些列是:“名称”,“时间”,“日期”和“月份”。我必须说明一个观点,即“ A”个人在同一天的“ Time” B做过几次。使用选择,我会将每个事件作为新行显示,例如

this.

但是我想要类似的东西

this:

sql中可能吗?

解决方法

如果您不知道每天的最大次数,请使用group_concat()

select name,day,group_concat(time) as times
from t
group by name,day;

如果这样做,则可以使用条件聚合:

select name,max(case when seqnum = 1 then time end) as time_1,max(case when seqnum = 2 then time end) as time_2,max(case when seqnum = 3 then time end) as time_3,max(case when seqnum = 4 then time end) as time_4
from (select t.*,row_number() over (partition by name,date order by time) as seqnum
      from t
     ) t
group by name,day;
,

如果使用mysql 5.x,则可以使用数据透视表

CREATE TABLE table1 (
  `Name` VARCHAR(1),`Time` VARCHAR(5),`Day` VARCHAR(4)
);

INSERT INTO table1
  (`Name`,`Time`,`Day`)
VALUES
  ('A','11:00','1/10'),('A','12:00','13:00','17:00','10:00','2/10'),'14:00','2/10');
SELECT 
`Name`,IF(@date = `Day`,@rn:= @rn +1,@rn:= 1) rn,@date := `Day` 'Day'
FROM table1,(SELECT @rn:= 0,@date := '')a
ORDER BY  `Name`,`Day`,`Time`
Name | rn | Time  | Day 
:--- | -: | :---- | :---
A    |  1 | 11:00 | 1/10
A    |  2 | 12:00 | 1/10
A    |  3 | 13:00 | 1/10
A    |  4 | 17:00 | 1/10
A    |  1 | 10:00 | 2/10
A    |  2 | 12:00 | 2/10
A    |  3 | 14:00 | 2/10
A    |  4 | 17:00 | 2/10
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('MAX(IF(s.`rn` = "',`rn`,'","")) AS time_',rn)
              ) INTO @sql
FROM (SELECT 
`Name`,`Time`) t1;


SET @sql = CONCAT('SELECT `Name`,',@sql,`Day`
                  FROM (SELECT 
`Name`,@date := `Day` "Day"
FROM table1,@date := "") a
ORDER BY  `Name`,`Time`)  s
                 GROUP BY s.`Name`,s.`Day`
                ORDER BY s.`Name`,s.`Day`');
#SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Name | time_1 | time_2 | time_3 | time_4 | Day 
:--- | :----- | :----- | :----- | :----- | :---
A    | 11:00  | 12:00  | 13:00  | 17:00  | 1/10
A    | 10:00  | 12:00  | 14:00  | 17:00  | 2/10

db 提琴here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。