如果是只有两个仓库,直接写比较简单 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
参考 精典的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 82declare @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那边 多的是.晕.
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 */
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
精典的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 82declare @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库存表和商品目录表
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
*/