当前位置:编程学习 > C#/ASP.NET >>

较复杂的SQL语句问题

表1
商品编号,商品名称 , 规格
001        牙膏       1*10 
002        橡皮       1*20   
表二
仓库编号 , 商品编号 , 库存数量
01            001        2
02            002        10


表3
仓库编号     仓库名称
01            主仓库
02            二楼仓库




我想用一条SQL语句,查询如下:

商品编号   商品名称    主仓库    二楼仓库
001           牙膏      2          0
002           橡皮      0          10


帮帮忙。。。请写下完整的SQL语句 谢谢 --------------------编程问答-------------------- sf --------------------编程问答-------------------- 参考:http://topic.csdn.net/u/20070629/06/9e048ebe-c0e3-4578-8ef7-78f1269a6a97.html --------------------编程问答--------------------  如果是只有两个仓库,直接写比较简单


declare @t1 table (商品编号 varchar(10), 商品名称 varchar(20))
insert @t1 
select '001', '牙膏' union 
select '002', '橡皮' 

declare @t2 table (仓库编号 varchar(10), 商品编号 varchar(10), 库存数量 int)
insert @t2 
select '01', '001', 2  union
select '02', '002', 10 

declare @t3 table (仓库编号 varchar(10), 仓库名称 varchar(20))
insert @t3 
select '01', '主仓库' union 
select '02', '二楼仓库' 


select a.商品编号, a.商品名称, isnull(b.主仓库,0) as 主仓库, isnull(c.二楼仓库,0) as 二楼仓库
from @t1 a
left join
(
select 商品编号, 库存数量 as 主仓库
from @t2 
where 仓库编号='01'
) b on a.商品编号 = b.商品编号
left join
(
select 商品编号, 库存数量 as 二楼仓库
from @t2 
where 仓库编号='02' 
) c on a.商品编号 = c.商品编号



商品编号       商品名称                 主仓库         二楼仓库        
---------- -------------------- ----------- ----------- 
001        牙膏                   2           0
002        橡皮                   0           10

--------------------编程问答--------------------
引用 3 楼 JeffChung 的回复:
如果是只有两个仓库,直接写比较简单 


SQL code
declare @t1 table (商品编号 varchar(10), 商品名称 varchar(20))
insert @t1 
select '001', '牙膏' union 
select '002', '橡皮' 

declare @t2 table (仓库编号 varchar(10), 商品编号 varchar(10), 库存数量 int)
insert @t2 
select '01', '001', 2  union
select '02', '002', 10 

declare @t3 table (仓库编号 varchar(10), 仓库名称 varchar(20))
inse…


正解 --------------------编程问答-------------------- 参考
精典的SQL语句(行列转换等)
http://zjt.nbfas.cn/show.aspx?id=16&cid=8
1. 行列转换--普通

假设有张学生成绩表(CJ)如下
Name    Subject     Result
张三    语文        80
张三    数学        90
张三    物理        85
李四    语文        85
李四    数学        92
李四    物理        82

想变成    
姓名   语文   数学   物理
张三   80     90     85
李四   85     92     82

declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
from (select distinct Subject from CJ) as a
select @sql = @sql+' from test group by name'
exec(@sql)


主要是要把表3仓库基础表进行行列转换然后去join库存表和商品目录表
--------------------编程问答-------------------- ...原理去SQL Server那边 多的是.晕. --------------------编程问答--------------------
引用 3 楼 JeffChung 的回复:
如果是只有两个仓库,直接写比较简单 


SQL code
declare @t1 table (商品编号 varchar(10), 商品名称 varchar(20))
insert @t1 
select '001', '牙膏' union 
select '002', '橡皮' 

declare @t2 table (仓库编号 varchar(10), 商品编号 varchar(10), 库存数量 int)
insert @t2 
select '01', '001', 2  union
select '02', '002', 10 

declare @t3 table (仓库编号 varchar(10), 仓库名称 varchar(20))
inse…


 这个写得很不错了. --------------------编程问答--------------------
declare @t1 table (商品编号 varchar(10), 商品名称 varchar(20))
insert @t1 
select '001', '牙膏' union 
select '002', '橡皮' 

declare @t2 table (仓库编号 varchar(10), 商品编号 varchar(10), 库存数量 int)
insert @t2 
select '01', '001', 2  union
select '02', '002', 10 

declare @t3 table (仓库编号 varchar(10), 仓库名称 varchar(20))
insert @t3 
select '01', '主仓库' union 
select '02', '二楼仓库' 


---2000静态SQL
select  商品编号,商品名称,
主仓库=sum(case 仓库名称 when '主仓库' then 库存数量 else 0 end),
二楼仓库=sum(case 仓库名称 when '二楼仓库' then 库存数量 else 0 end)
from 
(select a.商品编号,a.商品名称,b.库存数量,c.仓库名称 
from @t1 a join @t2 b on a.商品编号=b.商品编号 join @t3 c 
on b.仓库编号=c.仓库编号) t 
group by 商品编号,商品名称

--2005静态SQL
select 商品编号,商品名称,主仓库=ISNULL(主仓库,0),二楼仓库=ISNULL(二楼仓库,0) 
from
(select * from 
(select a.商品编号,a.商品名称,b.库存数量,c.仓库名称 from @t1 a join @t2 b  on a.商品编号=b.商品编号 join @t3 c on b.仓库编号=c.仓库编号) a 
pivot(sum(库存数量) for 仓库名称 in(主仓库,二楼仓库)) b
) t

/*
商品编号       商品名称                 主仓库         二楼仓库
---------- -------------------- ----------- -----------
001        牙膏                   2           0
002        橡皮                   0           10
*/
--------------------编程问答-------------------- 顶起来,友情UP --------------------编程问答-------------------- 帮顶

答案3楼 --------------------编程问答-------------------- 我的答案和3楼的一样! --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,