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

这样的查询结果怎么实现? 急求...
源表

编号 单位 地址 单号 产品 数量
1205057 顺达食品 黄海南路 98 达利源蛋黄派 24
1205057 顺达食品 黄海南路 98 伊犁纯酸乳 42
1205057 顺达食品 黄海南路 98 康师傅桶面 30
1205057 顺达食品 黄海南路 98 娃哈哈八宝粥 24




结果

编号 1205057 单位 顺达食品 地址 黄海南路 单号 98 产品 达利源蛋黄派 数量 24 产品 伊犁纯酸乳 数量 42 产品 康师傅桶面 数量 30 产品 娃哈哈八宝粥 数量 24

或 

1205057 顺达食品 黄海南路 98 达利源蛋黄派 24 伊犁纯酸乳 42 康师傅桶面 30 娃哈哈八宝粥 24


------解决方案--------------------
SQL code
declare @sql varchar(max)
set @sql='select distinct 编号,单位,地址,单号'
select @sql=@sql+',max(case 产品 when '''+产品+''' then '''+产品+''' end) as ['+产品+'],sum(case 产品 when '''+产品+''' then 数量 end) as ['+产品+']'
from cstable
set @sql=@sql+' from cstable group by 编号,单位,地址,单号'
print @sql
exec (@sql)

----
1205057    顺达食品    黄海南路    98    达利源蛋黄派    24    伊犁纯酸乳    42    康师傅桶面    30    娃哈哈八宝粥    24

------解决方案--------------------
探讨
wangjunjie321 的这个可以,能用纯语句吗?不用动态查询

------解决方案--------------------
SQL code

--> 测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
create table [test](
[编号] int,
[单位] varchar(8),
[地址] varchar(8),
[单号] int,
[产品] varchar(12),
[数量] int
)
insert [test]
select 1205057,'顺达食品','黄海南路',98,'达利源蛋黄派',24 union all
select 1205057,'顺达食品','黄海南路',98,'伊犁纯酸乳',42 union all
select 1205057,'顺达食品','黄海南路',98,'康师傅桶面',30 union all
select 1205057,'顺达食品','黄海南路',98,'娃哈哈八宝粥',24


-- 查询处理
SELECT *FROM (SELECT DISTINCT [编号],[单位],[地址],[单号] FROM [test])A
OUTER APPLY(
    SELECT 产品和数量= STUFF(REPLACE(REPLACE(
            (   SELECT [产品]+'  '+LTRIM([数量]) as VALUE FROM [test] N
                WHERE [编号]=A.编号 AND [单位]=A.单位 AND [地址]=A.地址 AND [单号]=A.单号
                FOR XML AUTO
             ), '<N value="', '  '), '"/>', ''), 1, 1, '')
)N

/*
编号    单位    地址    单号    产品和数量
1205057    顺达食品    黄海南路    98     达利源蛋黄派  24  伊犁纯酸乳  42  康师傅桶面  30  娃哈哈八宝粥  24
*/

------解决方案--------------------
SQL code
select distinct 编号,单位,地址,单号,内容=stuff((select' '+产品+' '+cast(数量 as varchar(10)) from cstable b    for xml path ('')),1,1,'')
from cstable a