T_A
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60生成以下表
cBrand A A A B B B C C C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运
仓A 60 20
仓B 20 100
仓C 60 60
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60生成以下表
cBrand A A A B B B C C C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运
仓A 60 20
仓B 20 100
仓C 60 60
解决方案 »
- 请教高手,数据导入的问题!!!
- xp系统可能安装SQL Server的什么版本?
- 關於在Sql Server中建Oralce的linked Server的問題?
- 邹建救我:安装SQL-Server2000,出现错误。怎么解决,为什么出现这种情况
- 确定30秒内最多能插入多少行记录
- SQL语句问题,很急!
- 请问如何写脚本来把两个完全相同的记录之一的某个字段修改?
- SQL行转换动态列的挑战!!
- MS-SQL Server 2000安装问题?急!!!
- 请问:SQL Sever中返回上条语句执行成功与否的全局变量是什么?
- 请教一个存储过程(初学)
- 求助:sql中有没有类似oracle中nvl()的函数??
(cBrand Nvarchar(10),
cGrade Char(1),
cType Nvarchar(10),
nQty Int)
Insert T_A Select N'仓A', 'A', N'生产', 10
Union All Select N'仓B', 'B', N'盘盈', 20
Union All Select N'仓C', 'C', N'生产', 60
Union All Select N'仓B', 'B', N'直运', 80
Union All Select N'仓A', 'A', N'直运', 20
Union All Select N'仓A', 'A', N'生产', 50
Union All Select N'仓B', 'B', N'直运', 20
Union All Select N'仓C', 'A', N'生产', 60
Go
Declare @S Nvarchar(4000)
Set @S=''
Select @S=@S+',SUM(Case When cGrade='''+cGrade+''' And cType=N'''+cType+''' Then nQty Else 0 End) As '+cGrade+cType
From (Select Distinct A.cGrade,B.cType From T_A A,T_A B) A Order By cGrade,cType
Select @S='Select cBrand'+@S+' From T_A Group By cBrand Order By cBrand'
EXEC(@S)
GO
Drop Table T_A
--Result
/*
cBrand A生产 A直运 A盘盈 B生产 B直运 B盘盈 C生产 C直运 C盘盈
仓A 60 20 0 0 0 0 0 0 0
仓B 0 0 0 0 100 20 0 0 0
仓C 60 0 0 0 0 0 60 0 0
*/
select @s='select cBrand'
select @s=@s+',['+cGrade+cType+']=sum(case when cGrade='''+cGrade+''' and cType='''+cType+''' then nQty else 0 end)' from T_A group by cGrade,cType
exec(@s+' from t_a group by cBrand')
set @sql='select cBrand'
select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' then nqty else 0 end)' from T_A order by cgrade
select @sql
exec (@sql+ ' from T_A group by cbrand order by cbrand')
---------------------------------------------------------------------------------
if exists(select * from sysobjects where name='T_A' and xtype='U') drop table T_A
GO
--生成测试用数据,为SELECT初始环境
CREATE TABLE T_A(cBrand varchar(10),cGrade varchar(10),cType varchar(10),nQty int)
insert T_A select '仓A','A','生产',10
union all select '仓B','B','盘盈',20
union all select '仓C','C','生产',60
union all select '仓B','B','直运',80
union all select '仓A','A','直运',20
union all select '仓A','A','生产',50
union all select '仓B','B','直运',20
union all select '仓C','A','生产',60--select * from T_A
GO
/*-- 此处为用来查询的SELECT语句 --*/
Declare @sql varchar(8000)
set @sql='select cBrand'
/*1.使用動態查詢方式生成列,查看效果
select @sql=@sql+','+cGrade+cType+'=case when cGrade='''+cGrade+''' then nqty else 0 end' from T_A order by cgrade
exec (@sql+ ' from T_A ')
*/
--2.由于需要進行分類統計,在上面的測試語句中加上sum(),并在exec( 中加入 group by
select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' then nqty else 0 end)' from T_A order by cgrade--group by cgrade
select @sql
exec (@sql+ ' from T_A group by cbrand order by cbrand')
GO
--删除测试散数据
DROP TABLE T_A/* -- 结果 --
cBrand A生产 A直运 A生产 A生产 B直运 B直运 B盘盈 C生产
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
仓A 80 80 80 80 0 0 0 0
仓B 0 0 0 0 120 120 120 0
仓C 60 60 60 60 0 0 0 60
*/ -- 完成 --
(cBrand Nvarchar(10),
cGrade Char(1),
cType Nvarchar(10),
nQty Int)
Insert T_A Select N'仓A', 'A', N'生产', 10
Union All Select N'仓B', 'B', N'盘盈', 20
Union All Select N'仓C', 'C', N'生产', 60
Union All Select N'仓B', 'B', N'直运', 80
Union All Select N'仓A', 'A', N'直运', 20
Union All Select N'仓A', 'A', N'生产', 50
Union All Select N'仓B', 'B', N'直运', 20
Union All Select N'仓C', 'A', N'生产', 60
GoSELECT *
FROM(
SELECT cBrand, FD = RTRIM(cGrade) + '_' + RTRIM(cType), nQty
FROM T_A
)DATA
PIVOT(
SUM(nQty)
FOR FD IN([A_生产], [A_直运], [A_盘盈], [B_生产], [B_直运], [B_盘盈], [C_生产], [C_直运], [C_盘盈])
)P
GODROP TABLE T_A-- 结果:
cBrand A_生产 A_直运 A_盘盈 B_生产 B_直运 B_盘盈 C_生产 C_直运 C_盘盈
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
仓A 60 20 NULL NULL NULL NULL NULL NULL NULL
仓B NULL NULL NULL NULL 100 20 NULL NULL NULL
仓C 60 NULL NULL NULL NULL NULL 60 NULL NULL
-------------------------------------------------------------
if exists(select * from sysobjects where name='T_A' and xtype='U') drop table T_A
GO
--生成测试用数据,为SELECT初始环境
CREATE TABLE T_A(cBrand varchar(10),cGrade varchar(10),cType varchar(10),nQty int)
insert T_A select '仓A','A','生产',10
union all select '仓B','B','盘盈',20
union all select '仓C','C','生产',60
union all select '仓B','B','直运',80
union all select '仓A','A','直运',20
union all select '仓A','A','生产',50
union all select '仓B','B','直运',20
union all select '仓C','A','生产',60--select distinct A.cgrade,B.ctype from T_A A,T_A B
GO
/*-- 此处为用来查询的SELECT语句 --*/
Declare @sql varchar(8000)
set @sql='select cBrand'
/*1.使用動態查詢方式生成列,查看效果
select @sql=@sql+','+cGrade+cType+'=case when cGrade='''+cGrade+''' then nqty else 0 end' from T_A order by cgrade
exec (@sql+ ' from T_A ')
*/
--2.由于需要進行分類統計,在上面的測試語句中加上sum(),并在exec( 中加入 group by
select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' and cType='''+cType+''' then nqty else 0 end)'
from (select distinct A.cgrade,B.ctype from T_A A,T_A B )A order by cgrade,ctype
select @sql
exec (@sql+ ' from T_A group by cbrand order by cbrand')GO
--删除测试散数据
DROP TABLE T_A/* -- 结果 --
cBrand A盘盈 A生产 A直运 B盘盈 B生产 B直运 C盘盈 C生产 C直运
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
仓A 0 60 20 0 0 0 0 0 0
仓B 0 0 0 20 0 100 0 0 0
仓C 0 60 0 0 0 0 0 60 0*/ -- 完成 -----------------------------------------
唉,偶不仅慢,还错呢!...鱼,学习了....
谢谢,再问一下,加上合计项该如何实现?
-----------------------------------------------
怎樣的合計,貼出你要的結果看看。
T_A
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60
仓A A 领出 10
仓A A 盘亏 20
生成以下表
cBrand A A A B B B C C C A A 存 存 存
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 A B C
仓A 60 20 10 20 50
仓B 20 100
仓C 60 60
合计 120 20 20 100 60 10 20 50
cBrand A A A B B B C C C A A A B C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存 存
仓A 60 20 10 20 50
仓B 20 100
仓C 60 60
合计 120 20 20 100 60 10 20 50
cBrand A A A B B B C C C A A A B C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存 存
仓A 60 0 20 0 0 0 0 0 0 10 20 50 0 0
仓B 0 0 0 0 20 100 0 0 0 0 0 0 120 0
仓C 60 0 0 0 0 0 60 0 0 0 0 0 0 60
合计 120 0 20 0 20 100 60 0 0 10 20 50 120 60
A A A B C
领出 盘亏 存 存 存
10 20 50存50是这样计算的:A存=A生产+A盘盈+A直运-A领出-A盘亏
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60
仓A A 领出 10
仓A A 盘亏 20
在上面的表记录有...
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60
仓A A 领出 10
仓A A 盘亏 20生成以下表
cBrand A A A B B B C C C A A A B C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存 存
仓A 60 20 10 20 50
仓B 20 100
仓C 60 60
合计 120 20 20 100 60 10 20 50
T_A
cBrand cGrade cType nQty
仓A A 生产 10
仓B B 盘盈 20
仓C C 生产 60
仓B B 直运 80
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60
仓A A 领出 10
仓A A 盘亏 20生成以下表
cBrand A A A B B B C C C A A A B C
生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存 存
仓A 60 20 10 20 50
仓B 20 100 120
仓C 60 60 60 60
合计 120 20 20 100 60 10 20 90 120 60
这样的逻辑,应该是开发语言中来写,而不是在通过SQL完成。
T_A
cBrand cGrade cType nQty
仓A A 生产 10
仓C C 生产 60
仓B B 直运 80
仓A C 盘盈 10
仓A A 直运 20
仓A A 生产 50
仓B B 直运 20
仓C A 生产 60
仓A A 领出 -10
仓A C 盘亏 -20
仓B A 领出 -30
生成以下表
cBrand A A B C C C A A C A B C
生产 直运 直运 生产 盘盈 直运 领出 盘亏 领出 存 存 存
仓A 60 20 10 -10 -20 -30 50 0 -30
仓B 100 20 100 -30 -30 100 120
仓C 60 60 60 60
合计 120 20 100 60 30 100 -40 -20 -30 80 100 150
cBrand A A B C C C A A C A B C
生产 直运 直运 生产 盘盈 直运 领出 盘亏 领出 存 存 存
仓A 60 20 10 -10 -20 -30 50 0 -30
仓B 100 20 100 -30 -30 100 120
仓C 60 60 60 60
合计 120 20 100 60 30 100 -40 -20 -30 80 100 150 这是什么跟什么啊,乱78糟,
set @s = ''
select @s = @s + ',' + cgrade + '_' + ctype + ' = sum(case when cGrade = ''' + cGrade + ''' and cType = ''' +cType + ''' then nQty else 0 end )'
from t_a group by cgrade,ctype
print @sselect @s = 'select cBrand ' + @s + ' from t_a group by cBrand'
exec(@s)