日期:2014-05-18  浏览次数:20546 次

求一个sql语句,横向数据纵向显示
表是这样
供应商 仓库 价格 数量
 001 001 10 10
 001 001 10 10
 001 001 20 10
 001 002 10 10
 002 001 10 10


供应商:
001:供应商1,002:供应商2
仓库:
001:总仓,002:总仓2
我希望得到一些结果
 供应商 总仓 总仓2 合计  
 供应商1 400 100 500
 供应商2 100 0 100


------解决方案--------------------
SQL code
create table t1(供应商 varchar(10),仓库 varchar(10),价格 int,数量 int)
insert into t1 values('001', '001', 10 ,10)
insert into t1 values('001', '001', 10 ,10)
insert into t1 values('001', '001', 20 ,10)
insert into t1 values('001', '002', 10 ,10)
insert into t1 values('002', '001', 10 ,10)
create table t2(供应商 varchar(10),供应商_name varchar(20))
insert into t2 values('001','供应商1')
insert into t2 values('002','供应商2')
create table t3(仓库 varchar(10) , 仓库_name varchar(20))
insert into t3 values('001','总仓1')
insert into t3 values('002','总仓2')
go
--如果总仓固定为1,2,则如下:

select t2.供应商_name 供应商,
       sum(case when t3.仓库_name = '总仓1' then t1.价格 * t1.数量 else 0 end) [总仓1],
       sum(case when t3.仓库_name = '总仓2' then t1.价格 * t1.数量 else 0 end) [总仓2],
       sum(t1.价格 * t1.数量) 合计 
from t1 , t2 , t3
where t1.供应商 = t2.供应商 and t1.仓库 = t3.仓库
group by t2.供应商_name

drop table t1 , t2 , t3

/*
供应商                  总仓1         总仓2         合计          
-------------------- ----------- ----------- ----------- 
供应商1                 400         100         500
供应商2                 100         0           100

(所影响的行数为 2 行)
*/

------解决方案--------------------
SQL code
create table t1(供应商 varchar(10),仓库 varchar(10),价格 int,数量 int)
insert into t1 values('001', '001', 10 ,10)
insert into t1 values('001', '001', 10 ,10)
insert into t1 values('001', '001', 20 ,10)
insert into t1 values('001', '002', 10 ,10)
insert into t1 values('002', '001', 10 ,10)
create table t2(供应商 varchar(10),供应商_name varchar(20))
insert into t2 values('001','供应商1')
insert into t2 values('002','供应商2')
create table t3(仓库 varchar(10) , 仓库_name varchar(20))
insert into t3 values('001','总仓1')
insert into t3 values('002','总仓2')
go
--如果总仓固定为1,2,则如下:
select t2.供应商_name 供应商,
       sum(case when t3.仓库_name = '总仓1' then t1.价格 * t1.数量 else 0 end) [总仓1],
       sum(case when t3.仓库_name = '总仓2' then t1.价格 * t1.数量 else 0 end) [总仓2],
       sum(t1.价格 * t1.数量) 合计 
from t1 , t2 , t3
where t1.供应商 = t2.供应商 and t1.仓库 = t3.仓库
group by t2.供应商_name
/*
供应商                  总仓1         总仓2         合计          
-------------------- ----------- ----------- ----------- 
供应商1                 400         100         500
供应商2                 100         0           100

(所影响的行数为 2 行)
*/


--如果总仓不固定,则如下:
declare @sql varchar(8000)
set @sql = 'select t2.供应商_name 供应商 '
select @sql = @sql + ' , sum(case t3.仓库_name when ''' + 仓库_name + ''' then t1.价格 * t1.数量 else 0 end) [' + 仓库_name + ']'
from (select distinct 仓库_name from t3) as a
set @sql = @sql + ' ,sum(t1.价格 * t1.数量) 合计 from t1 , t2 , t3 where t1.供应商 = t2.供应商 and t1.仓库 = t3.仓库 group by t2.供应商_name'
exec(@sql) 
/*
供应商                  总仓1         总仓2         合计          
-------------------- ----------- ----------- ----------- 
供应商1                 400         100         500
供应商2                 100         0           100
*/

drop table t1 , t2 , t3

------解决方案--------------------
有关行列转换的其他内容则参考如下:
SQL code

/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三'