- SQL code
/*有一个表test1系统单号 单据状态 系统行号 单据编号 附加说明 日期 系统款号 款号 名称 系统颜色编号 系统尺码编号 颜色 尺码 数量 箱号3 未审核 3 JHDD-2011-12-24-00001 2011-12-24 712 1002 牛仔裤 828 831 蓝色 170 1.00000000 3-33 未审核 3 JHDD-2011-12-24-00001 2011-12-24 712 1002 牛仔裤 828 832 蓝色 175 2.00000000 3-33 未审核 3 JHDD-2011-12-24-00001 2011-12-24 712 1002 牛仔裤 828 833 蓝色 180 3.00000000 3-33 未审核 3 JHDD-2011-12-24-00001 2011-12-24 712 1002 牛仔裤 828 840 蓝色 185 NULL 3-33 未审核 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 Test1endGOCREATE 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]GOInsert 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 test1go------以下语句怎么改才能实现 动态合计数量?declare @s varchar(8000)set @s=''Select @[email protected]+','+quotename([尺码])+'=max(case when [尺码]='+quotename([尺码],'''')+' then [数量] else null end)'from test1 group by [尺码]exec('select [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色] [email protected]+' from test1group by [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色]')
------解决方案--------------------
- SQL code
declare @s Nvarchar(4000)set @s=''Select @[email protected]+','+quotename([尺码])+N'=max(case when [尺码]='+quotename([尺码],'''')+N' then [数量] else null end)'from test1 group by [尺码]exec(N'select [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色] [email protected]+N',sum([数量])[数量] from test1group by [单据状态],[系统单号],[系统行号],[系统款号],[款号],[名称],[系统颜色编号],[箱号],[颜色]')