如何解决将每次出现的选择都放入新列SQL
我有一个sql数据库,其中包含一个由4列组成的简单表。这些列是:“名称”,“时间”,“日期”和“月份”。我必须说明一个观点,即“ A”个人在同一天的“ Time” B做过几次。使用选择,我会将每个事件作为新行显示,例如
但是我想要类似的东西
在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 举报,一经查实,本站将立刻删除。