菜鸟被这sql结果难倒了3天,求帮助、求温暖!

xdrs1314 2012-11-08 09:39:35

--用户表
create table Users
( uid int primary key not null,
uname varchar (30)
);

--商品表
create table goods
(
gid int primary key not null,
goods_name varchar (200)
);
--商品属性表
create table goods_attribute
(
aid int primary key not null,
gid int,
model_name varchar (200) ,
price decimal(10,2)
);

--用户商品订单表
create table OrderInfo
( oid int primary key not null,
uid int ,
gid int
);


insert into Users values(1, '张三');
insert into Users values(2, '李四');
insert into Users values(3, '王五');

insert into goods values(1, '华为手机');
insert into goods values(2, '联想电脑');
insert into goods values(3, '比亚迪汽车');
insert into goods values(4, '汤臣别墅');
insert into goods values(5, '佳能相机');

insert into goods_attribute values(1, 1,'N8888',1888);
insert into goods_attribute values(2, 2,'L1688',4680);
insert into goods_attribute values(3, 3,'E6SF',88888);
insert into goods_attribute values(4, 4,'豪华',8888888);
insert into goods_attribute values(5, 5,'600D',4888);

insert into orderinfo values(1,1,1);
insert into orderinfo values(2,1,2);
insert into orderinfo values(3,1,3);
insert into orderinfo values(4,1,4);
insert into orderinfo values(5,2,1);



db2 数据库现在需求要求,查询数据为所有用户订单中的每个商品名、属性、价格,要求是动态获得。
格式如下:
--用户名 商品名1 商品1型号 商品1价格 商品2 商品2型号 商品2价格..
uname goods_name1 model_name1 price1 goods_name2 model_name2 price2 ...
张三 华为手机 N8888 1888 联想电脑 L1688 4680 .....
李四 华为手机 N8888 1888 null null null .....
王五 null null null null null null ......

商品是有多个,需要动态语句,万分感谢!
...全文
616 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
悲催的程序猿 2012-12-12
  • 打赏
  • 举报
回复
xdrs1314 2012-11-11
  • 打赏
  • 举报
回复
屌丝的我在光棍节顾不上过节,而在此求大牛们解决我的这个问题。
xdrs1314 2012-11-10
  • 打赏
  • 举报
回复
我使用的是DB2 数据库,家里没有db2环境,不能验证,求DB2高人继续指点带路。
wwwwb 2012-11-09
  • 打赏
  • 举报
回复
思路是一样的, 就是用字符串累加生成SQL语句的方法生成 MAX(CASE WHEN C.`goods_name`= '手机' THEN '是' ELSE '否' END ) AS 手机, MAX(CASE WHEN C.`goods_name`='电脑' THEN '是' ELSE '否' END) AS 电脑, MAX(CASE WHEN C.`goods_name`='汽车' THEN '是' ELSE '否' END) AS 汽车, MAX(CASE WHEN C.`goods_name`='别墅' THEN '是' ELSE '否' END) AS 别墅, MAX(CASE WHEN C.`goods_name`= '相机' THEN '是' ELSE '否' END) AS 相机 中的'手机'、'电脑'等等内容,自己试试吧
WWWWA 2012-11-09
  • 打赏
  • 举报
回复
参考上次那个帖子的方法
http://bbs.csdn.net/topics/390271954
mysdzlt2007 2012-11-09
  • 打赏
  • 举报
回复
CREATE PROCEDURE DB2ADMIN.GETUSERGOODS() 
RESULT SETS 1 
LANGUAGE SQL 
P: BEGIN 
DECLARE end_state INT DEFAULT 0; 
DECLARE good_id_it INT DEFAULT 0; 
DECLARE good_id VARCHAR(10); 
DECLARE sql_str VARCHAR(10000); 
DECLARE stmt STATEMENT; 
DECLARE rscur CURSOR WITH RETURN TO CALLER FOR stmt;
DECLARE cycur CURSOR FOR SELECT gid FROM goods; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_state=1; 
SET sql_str='SELECT u.uid,u.uname';
OPEN cycur; 
FETCH cycur INTO good_id_it; 
WHILE end_state=0 DO 
SET good_id=RTRIM(CAST(good_id_it AS CHAR(10)));
SET sql_str=sql_str||',MAX((CASE g.gid WHEN '||good_id||' THEN g.goods_name ELSE NULL END)) AS goods_name'||good_id||',MAX((CASE ga.gid WHEN '||good_id||' THEN ga.model_name ELSE NULL END)) AS model_name'||good_id||',MAX((CASE ga.gid WHEN '||good_id||' THEN ga.price ELSE NULL END)) AS price'||good_id;
FETCH cycur INTO good_id_it; 
END WHILE; 
CLOSE cycur;
SET sql_str=sql_str||' FROM Users u LEFT JOIN orderinfo o ON u.uid=o.uid LEFT JOIN goods g ON o.gid=g.gid LEFT JOIN goods_attribute ga ON g.gid=ga.gid GROUP BY u.uid,u.uname'; 
PREPARE stmt FROM sql_str;
OPEN rscur; 
END P
---------------------------------------------------
CALL DB2ADMIN.GETUSERGOODS();
xdrs1314 2012-11-08
  • 打赏
  • 举报
回复
大神、大牛们来吧,公司没有网络,这sql让我酱油了3天了。

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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