问题描述
我有一个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