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

如何加合计?
SQL code

/*
有一个表test1

系统单号 单据状态 系统行号 单据编号 附加说明 日期 系统款号 款号 名称 系统颜色编号 系统尺码编号 颜色 尺码 数量 箱号
3    未审核    3    JHDD-2011-12-24-00001        2011-12-24    712    1002    牛仔裤    828    831    蓝色    170    1.00000000    3-3
3    未审核    3    JHDD-2011-12-24-00001        2011-12-24    712    1002    牛仔裤    828    832    蓝色    175    2.00000000    3-3
3    未审核    3    JHDD-2011-12-24-00001        2011-12-24    712    1002    牛仔裤    828    833    蓝色    180    3.00000000    3-3
3    未审核    3    JHDD-2011-12-24-00001        2011-12-24    712    1002    牛仔裤    828    840    蓝色    185    NULL    3-3
3    未审核    3    JHDD-2011-12-24-00001        2011-12-24    712    1002    牛仔裤    828    841    蓝色    190    NULL    3-3

写一个SQL要生成的查询为:
单据状态 系统单号 系统行号 系统款号 款号  名称  系统颜色编号 箱号  颜色 合计数量   170            175           180            185     190
未审核    3    3    712    1002    牛仔裤    828    3-3    蓝色 6        1.00000000       2.00000000      3.00000000    NULL    NULL

尺码是动态变化的
怎么写呀,动态 合计数量 不会呀,怎么弄?


*/






---建立测试环境(MSSQL2000)
if  exists (select * from sysobjects where id = object_id(N'Test1') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
begin
   drop table Test1
end
GO


CREATE TABLE [test1] (
    [系统单号] [int] NOT NULL ,
    [单据状态] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL ,
    [系统行号] [int] NULL ,
    [单据编号] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
    [附加说明] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
    [日期] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [系统款号] [int] NULL ,
    [款号] [varchar] (60) COLLATE Chinese_PRC_CI_AS NULL ,
    [名称] [varchar] (60) COLLATE Chinese_PRC_CI_AS NULL ,
    [系统颜色编号] [int] NULL ,
    [系统尺码编号] [int] NOT NULL ,
    [颜色] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [尺码] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [数量] [numeric](20, 8) NULL ,
    [箱号] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO


Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 3,'未审核',3,'JHDD-2011-12-24-00001','','2011-12-24',712,'1002','牛仔裤',828,831,'蓝色','170',1.00000000,'3-3')
Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 3,'未审核',3,'JHDD-2011-12-24-00001','','2011-12-24',712,'1002','牛仔裤',828,832,'蓝色','175',2.00000000,'3-3')
Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 3,'未审核',3,'JHDD-2011-12-24-00001','','2011-12-24',712,'1002','牛仔裤',828,833,'蓝色','180',3.00000000,'3-3')
Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 3,'未审核',3,'JHDD-2011-12-24-00001','','2011-12-24',712,'1002','牛仔裤',828,840,'蓝色','185',NULL,'3-3')
Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 3,'未审核',3,'JHDD-2011-12-24-00001','','2011-12-24',712,'1002','牛仔裤',828,841,'蓝色','190',NULL,'3-3')
--Insert test1 (系统单号,单据状态,系统行号,单据编号,附加说明,日期,系统款号,款号,名称,系统颜色编号,系统尺码编号,颜色,尺码,数量,箱号)  Values ( 2,'未审核',2,'JHDD-2011-12-24-00001','','2011-12-24',711,'1001','上衣',828,851,'蓝色','XL',5.00000000,'2-2')
select * from test1

go

------以下语句怎么改才能实现 动态合计数量?
declare @s varchar(8000)

set @s=''

Select @s=@s+','+quotename([尺码])+'=max(case when [尺码]='+quotename([尺码],'''')+' then [数量] else null end)'

from test1 

group by [尺码]

exec('select [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色] '+@s+' from test1
group by [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色]')













------解决方案--------------------
SQL code
declare @s Nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([尺码])+N'=max(case when [尺码]='+quotename([尺码],'''')+N' then [数量] else null end)'
from test1 
group by [尺码]
exec(N'select [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色] '+@s+N',sum([数量])[数量