这样结果mysql怎么实现

Mozhx 2010-01-28 11:55:48
表中数据:
id uName pName amount
1 A 广州 10
2 A 羊城 20
3 A 南方 30
4 B 广州 10
5 B 羊城 20
6 B 南方 30
....
...

要求结果:

用户名 广州 羊城 南方
A 10 20 30
B 10 20 30
..
..



...全文
284 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
可以参考一下这个贴子中的几种方法。
http://blog.csdn.net/ACMAIN_CHM/archive/2009/06/19/4283943.aspx
MySQL交叉表
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
pName列数据有很多,在不确定情况怎么实现??
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
pName列有很多数据,不可能每条数据都写case when pName='广州' then amount else 0)吧
百年树人 2010-01-28
  • 打赏
  • 举报
回复
select
uName as 用户名,
sum(case when pName='广州' then amount else 0) as 广州,
sum(case when pName='羊城' then amount else 0) as 羊城,
sum(case when pName='南方' then amount else 0) as 南方
from
tb
group by
uName

ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
select uName as 用户名,
sum(if(pName='广州',amount,0)) as 广州,
sum(if(pName='羊城',amount,0)) as 羊城,
sum(if(pName='南方',amount,0)) as 南方
from 表中数据
group by uName
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
可以了,加个WITH ROLLUP进去。


谢谢ACMAIN_CHM了,每次都给我解决问题。
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
SET @EE='';
SELECT @EE:=CONCAT(@EE,'SUM(IF(pagerName=\'',pagerName,'\'',',amount,0)) AS `',pagerName,'`,') FROM (SELECT DISTINCT pagerName FROM history_number where pdate='2010-01-29' order by orderNo) A;
SET @QQ=CONCAT('SELECT userName,',@EE,'SUM(amount) AS TOTAL FROM history_number GROUP BY userName union all SELECT \'total\',',@EE,'SUM(amount) AS TOTAL FROM history_number');
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
嗯,现在可以了,还要求增加一行进行每列合计的,怎么写
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
DROP TABLE IF EXISTS `history_number`;
CREATE TABLE `history_number` (
`id` int(11) NOT NULL auto_increment,
`userId` int(11) default NULL,
`pagerId` int(11) default NULL,
`userName` varchar(50) default NULL,
`pagerName` varchar(50) default NULL,
`amount` int(11) default NULL,
`actualAmount` int(11) default NULL,
`price` double default NULL,
`money` double default NULL,
`pdate` date default NULL,
`issue` int(11) default NULL,
`orderNo` int(11) default NULL,
`isPrint` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
试一下 #15楼 代码。

或者提供你的 create table / insert into 语句

建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

Mozhx 2010-01-28
  • 打赏
  • 举报
回复
12楼的跟11楼一样啊,还是在这里 0)) AS 晚报, ,SUM(amount) AS 多了一个逗号
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 acmain_chm 的回复:]
12 楼的代码,哪儿来的 left ???
[/Quote]

12楼的结果还是这样:

SUM(IF(pagerName='广州日报',amount,0)) AS 广州日报,SUM(IF(pagerName='晚报',amount,0)) AS 晚报,
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
LEFT(@EE,LENGTH(@EE)-1)截取字符串时根本就没有减少一个,

我用SELECT LEFT(@EE,LENGTH(@EE)-581)时,才能将@EE变量值的最后一个字符去掉,如果>581就全部输出了


在下面代码的LEFT(@EE,LENGTH(@EE)-1)根本不起作用,就算-581也不起作用。
SET @QQ=CONCAT('SELECT ifnull(userName,\'total\'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(amount) AS TOTAL FROM history_number GROUP BY userName WITH ROLLUP');
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
SET @EE='';
SELECT @EE:=CONCAT(@EE,'SUM(IF(pagerName=\'',pagerName,'\'',',amount,0)) AS `',pagerName,'`,') FROM (SELECT DISTINCT pagerName FROM history_number where pdate='2010-01-29' order by orderNo) A;
SET @QQ=CONCAT('SELECT ifnull(userName,\'total\'),',@EE,'SUM(amount) AS TOTAL FROM history_number GROUP BY userName');
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
12 楼的代码,哪儿来的 left ???
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
还是不行,在下面地方还是多了一个逗号。

0)) AS 晚报, ,SUM(amount) AS


好像是left函数起不了作用
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
SET @EE='';
SELECT @EE:=CONCAT(@EE,'SUM(IF(pagerName=\'',pagerName,'\'',',amount,0)) AS `',pagerName,'`,') FROM (SELECT DISTINCT pagerName FROM history_number where pdate='2010-01-29' order by orderNo) A;
SET @QQ=CONCAT('SELECT ifnull(userName,\'total\'),',@EE,' ,SUM(amount) AS TOTAL FROM history_number GROUP BY userName');
Mozhx 2010-01-28
  • 打赏
  • 举报
回复
select @EE; 结果:

SUM(IF(pagerName='广州日报',amount,0)) AS 广州日报,SUM(IF(pagerName='晚报',amount,0)) AS 晚报,

select @QQ; 结果:

SELECT ifnull(userName,'total'),SUM(IF(pagerName='广州日报',amount,0)) AS 广州日报,SUM(IF(pagerName='晚报',amount,0)) AS 晚报, ,SUM(amount) AS TOTAL FROM history_number GROUP BY userName WITH ROLLUP

是不是晚报后面多了一个, 0)) AS 晚报, ,SUM(amount) AS
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
改成 如下试一下。
SELECT @EE:=CONCAT(@EE,'SUM(IF(pagerName=\'',pagerName,'\'',',amount,0)) AS `',pagerName,'`,') FROM (SELECT DISTINCT pagerName FROM history_number where pdate='2010-01-29' order by orderNo) A;
ACMAIN_CHM 2010-01-28
  • 打赏
  • 举报
回复
select @EE;
select @QQ;

应该输出两个结果啊? 你的MYSQL有问题?只输入了一个?另一个为空???
加载更多回复(3)

56,679

社区成员

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

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