求 mysql 动态行列转换

guozhiyi 2011-12-16 07:03:52
表结构及数据如下:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL DEFAULT '0',
`name` varchar(4) CHARACTER SET utf8 NOT NULL DEFAULT '',
`count` int(11) NOT NULL DEFAULT '0',
`date` int(11) NOT NULL,
`hour` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `test` VALUES ('1', 'name', '30555', '20111203', '0');
INSERT INTO `test` VALUES ('1', 'name', '30265', '20111203', '1');
INSERT INTO `test` VALUES ('1', 'name', '30197', '20111203', '2');
INSERT INTO `test` VALUES ('1', 'name', '30109', '20111203', '3');
INSERT INTO `test` VALUES ('1', 'name', '30103', '20111203', '4');
INSERT INTO `test` VALUES ('1', 'name', '30138', '20111203', '5');
INSERT INTO `test` VALUES ('1', 'name', '30230', '20111203', '6');
INSERT INTO `test` VALUES ('1', 'name', '30469', '20111203', '7');
INSERT INTO `test` VALUES ('1', 'name', '30474', '20111203', '8');
INSERT INTO `test` VALUES ('1', 'name', '30580', '20111203', '9');
INSERT INTO `test` VALUES ('1', 'name', '30588', '20111203', '10');
INSERT INTO `test` VALUES ('1', 'name', '30307', '20111203', '11');
INSERT INTO `test` VALUES ('1', 'name', '30358', '20111203', '12');
INSERT INTO `test` VALUES ('1', 'name', '30610', '20111203', '13');
INSERT INTO `test` VALUES ('1', 'name', '30504', '20111203', '14');
INSERT INTO `test` VALUES ('1', 'name', '30382', '20111203', '15');
INSERT INTO `test` VALUES ('1', 'name', '30459', '20111203', '16');
INSERT INTO `test` VALUES ('1', 'name', '30437', '20111203', '17');
INSERT INTO `test` VALUES ('1', 'name', '30533', '20111203', '18');
INSERT INTO `test` VALUES ('1', 'name', '30583', '20111203', '19');
INSERT INTO `test` VALUES ('1', 'name', '30625', '20111203', '20');
INSERT INTO `test` VALUES ('1', 'name', '30839', '20111203', '21');
INSERT INTO `test` VALUES ('1', 'name', '30832', '20111203', '22');
INSERT INTO `test` VALUES ('1', 'name', '30755', '20111203', '23');
INSERT INTO `test` VALUES ('1', 'name', '20555', '20111202', '0');
INSERT INTO `test` VALUES ('1', 'name', '20265', '20111202', '1');
INSERT INTO `test` VALUES ('1', 'name', '20197', '20111202', '2');
INSERT INTO `test` VALUES ('1', 'name', '20109', '20111202', '3');
INSERT INTO `test` VALUES ('1', 'name', '20103', '20111202', '4');
INSERT INTO `test` VALUES ('1', 'name', '20138', '20111202', '5');
INSERT INTO `test` VALUES ('1', 'name', '20230', '20111202', '6');
INSERT INTO `test` VALUES ('1', 'name', '20469', '20111202', '7');
INSERT INTO `test` VALUES ('1', 'name', '20474', '20111202', '8');
INSERT INTO `test` VALUES ('1', 'name', '20580', '20111202', '9');
INSERT INTO `test` VALUES ('1', 'name', '20588', '20111202', '10');
INSERT INTO `test` VALUES ('1', 'name', '20307', '20111202', '11');
INSERT INTO `test` VALUES ('1', 'name', '20358', '20111202', '12');
INSERT INTO `test` VALUES ('1', 'name', '20610', '20111202', '13');
INSERT INTO `test` VALUES ('1', 'name', '20504', '20111202', '14');
INSERT INTO `test` VALUES ('1', 'name', '20382', '20111202', '15');
INSERT INTO `test` VALUES ('1', 'name', '20459', '20111202', '16');
INSERT INTO `test` VALUES ('1', 'name', '20437', '20111202', '17');
INSERT INTO `test` VALUES ('1', 'name', '20533', '20111202', '18');
INSERT INTO `test` VALUES ('1', 'name', '20583', '20111202', '19');
INSERT INTO `test` VALUES ('1', 'name', '20625', '20111202', '20');
INSERT INTO `test` VALUES ('1', 'name', '20839', '20111202', '21');
INSERT INTO `test` VALUES ('1', 'name', '20832', '20111202', '22');
INSERT INTO `test` VALUES ('1', 'name', '20755', '20111202', '23');
INSERT INTO `test` VALUES ('1', 'name', '10555', '20111201', '0');
INSERT INTO `test` VALUES ('1', 'name', '10265', '20111201', '1');
INSERT INTO `test` VALUES ('1', 'name', '10197', '20111201', '2');
INSERT INTO `test` VALUES ('1', 'name', '10109', '20111201', '3');
INSERT INTO `test` VALUES ('1', 'name', '10103', '20111201', '4');
INSERT INTO `test` VALUES ('1', 'name', '10138', '20111201', '5');
INSERT INTO `test` VALUES ('1', 'name', '10230', '20111201', '6');
INSERT INTO `test` VALUES ('1', 'name', '10469', '20111201', '7');
INSERT INTO `test` VALUES ('1', 'name', '10474', '20111201', '8');
INSERT INTO `test` VALUES ('1', 'name', '10580', '20111201', '9');
INSERT INTO `test` VALUES ('1', 'name', '10588', '20111201', '10');
INSERT INTO `test` VALUES ('1', 'name', '10307', '20111201', '11');
INSERT INTO `test` VALUES ('1', 'name', '10358', '20111201', '12');
INSERT INTO `test` VALUES ('1', 'name', '10610', '20111201', '13');
INSERT INTO `test` VALUES ('1', 'name', '10504', '20111201', '14');
INSERT INTO `test` VALUES ('1', 'name', '10382', '20111201', '15');
INSERT INTO `test` VALUES ('1', 'name', '10459', '20111201', '16');
INSERT INTO `test` VALUES ('1', 'name', '10437', '20111201', '17');
INSERT INTO `test` VALUES ('1', 'name', '10533', '20111201', '18');
INSERT INTO `test` VALUES ('1', 'name', '10583', '20111201', '19');
INSERT INTO `test` VALUES ('1', 'name', '10625', '20111201', '20');
INSERT INTO `test` VALUES ('1', 'name', '10839', '20111201', '21');
INSERT INTO `test` VALUES ('1', 'name', '10832', '20111201', '22');
INSERT INTO `test` VALUES ('1', 'name', '10755', '20111201', '23');
INSERT INTO `test` VALUES ('1', 'name', '555', '20111130', '0');
INSERT INTO `test` VALUES ('1', 'name', '265', '20111130', '1');
INSERT INTO `test` VALUES ('1', 'name', '197', '20111130', '2');
INSERT INTO `test` VALUES ('1', 'name', '109', '20111130', '3');
INSERT INTO `test` VALUES ('1', 'name', '103', '20111130', '4');
INSERT INTO `test` VALUES ('1', 'name', '138', '20111130', '5');
INSERT INTO `test` VALUES ('1', 'name', '230', '20111130', '6');
INSERT INTO `test` VALUES ('1', 'name', '469', '20111130', '7');
INSERT INTO `test` VALUES ('1', 'name', '474', '20111130', '8');
INSERT INTO `test` VALUES ('1', 'name', '580', '20111130', '9');
INSERT INTO `test` VALUES ('1', 'name', '588', '20111130', '10');
INSERT INTO `test` VALUES ('1', 'name', '307', '20111130', '11');
INSERT INTO `test` VALUES ('1', 'name', '358', '20111130', '12');
INSERT INTO `test` VALUES ('1', 'name', '610', '20111130', '13');
INSERT INTO `test` VALUES ('1', 'name', '504', '20111130', '14');
INSERT INTO `test` VALUES ('1', 'name', '382', '20111130', '15');
INSERT INTO `test` VALUES ('1', 'name', '459', '20111130', '16');
INSERT INTO `test` VALUES ('1', 'name', '437', '20111130', '17');
INSERT INTO `test` VALUES ('1', 'name', '533', '20111130', '18');
INSERT INTO `test` VALUES ('1', 'name', '583', '20111130', '19');
INSERT INTO `test` VALUES ('1', 'name', '625', '20111130', '20');
INSERT INTO `test` VALUES ('1', 'name', '839', '20111130', '21');
INSERT INTO `test` VALUES ('1', 'name', '832', '20111130', '22');
INSERT INTO `test` VALUES ('1', 'name', '866', '20111130', '23');

求一动态sql,查询指定日期段内的数据,获得以下格式的结果集:
hour 20111130 20111201 20111202 20111203
0 555 10555 20555 30555
1 265 10265 20265 30265
2 197 10197 20197 30197
3 109 10109 20109 30109
4 103 10103 20103 30103
5 138 10138 20138 30138
6 230 10230 20230 30230
........

...全文
158 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2011-12-19
  • 打赏
  • 举报
回复
行->列,动态、静态两种,前者可以用SP解决,自己解决更好
无天 2011-12-18
  • 打赏
  • 举报
回复
cool,学习了。
rucypli 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guozhiyi 的回复:]
2楼你给的帖子我之前有看过.没发贴之前一直没整出来,是因为没有加sum,tmd太丢人了.
昨晚发贴后就搞定了.这里贴下sql..还是感谢你.

set @field = '';
SELECT @field:=CONCAT(@field,' sum(if(date=',date,',count,0)) as ''',Date(date),''',') FROM
(select dat……
[/Quote]
自己搞定比较赞
guozhiyi 2011-12-17
  • 打赏
  • 举报
回复
2楼你给的帖子我之前有看过.没发贴之前一直没整出来,是因为没有加sum,tmd太丢人了.
昨晚发贴后就搞定了.这里贴下sql..还是感谢你.

set @field = '';
SELECT @field:=CONCAT(@field,' sum(if(date=',date,',count,0)) as ''',Date(date),''',') FROM
(select date from test where id=1 and date>=20111130 and date<=20111203 group by date) a;
SET @strSql=CONCAT('SELECT hour as 小时,',LEFT(@field,LENGTH(@field)-1),
' FROM test where id=1 and date>=20111130 and date<=20111203 group by hour');
PREPARE stmt2 FROM @strSql;
EXECUTE stmt2;
ACMAIN_CHM 2011-12-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/acmain_chm/article/details/4283943
MySQL交叉表
在某些数据库中有交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198现整理解法如下:数据样本: create table tx( id int primary key, c1 c...

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧