原代码如下:
CREATE  PROCEDURE dbo.cdh_hechunyeartest
@key nvarchar(50),@year nvarchar(50)
    as
    set nocount on
    begin
declare @i int
set @i = 1
SELECT  dbo.VIEW2.单位名称, (
      SUM(CASE 
WHEN 库存年月 = @year+convert(varchar(20),@i) THEN 含税单价 * 数量 ELSE 0 END) 
      AS [201301销售额], 
FROM dbo.VIEW2
GROUP BY dbo.VIEW2.单位名称
end 我想实现的效果是:用while @i<13可以实现吗?应如何实现?
SELECT  dbo.VIEW2.单位名称, (
SUM(CASE WHEN 库存年月 = @year+01) THEN 含税单价 * 数量 ELSE 0 END)  AS [201301销售额],   
SUM(CASE WHEN 库存年月 = @year+'02') THEN 含税单价 * 数量 ELSE 0 END)  AS [201302销售额],
    SUM(CASE WHEN 库存年月 = @year+'03') THEN 含税单价 * 数量 ELSE 0 END)  AS [201303销售额], 
.
.
.
.
.
.
.FROM dbo.VIEW2
GROUP BY dbo.VIEW2.单位名称

解决方案 »

  1.   

    可以啊,用while 没问题啊
    你拼个@sql 然后去执行declare @sql varchar(4000)
    declare @i int
    set @i=0while @i<13
    begin
    set @sql = 'select '+cast(@i as varchar(2)) --这里改成你要拼的sql 比如insert into一个临时表,如果你需要一个结果集,那么在while循环结束后查一下就出整个的结果了
    exec (@sql)
    set @i=@i+1
    end
      

  2.   

    CREATE TABLE #View
    (
     [单位名称] NVARCHAR(200)
    ,[库存年月] CHAR(6)
    ,[含税单价] DECIMAL(9,2)
    ,[数量] INT
    )
    INSERT INTO #View
      SELECT 'A','201304',123.00,5
    UNION ALL SELECT  'A','201305',123.00,3
    UNION ALL SELECT  'B','201304',433.00,5
    UNION ALL SELECT  'B','201305',323.00,6
    UNION ALL SELECT  'C','201304',213.00,5
    UNION ALL SELECT  'C','201305',115.00,3
    UNION ALL SELECT  'D','201304',167.00,2
    UNION ALL SELECT  'D','201305',176.00,4
    UNION ALL SELECT  'D','201306',154.00,7
    UNION ALL SELECT  'C','201306',112.00,3
    UNION ALL SELECT  'B','201306',456.00,6
    UNION ALL SELECT  'A','201305',451.00,5/*
    不明白你为什么要用这样的方式来取
    很明显你的业务是查询每个单位每月的销售额
    这是我的做法:
    1,先统计每个单位每月的销售额,根据单位和年月分组算金额
    2,最终结果是给客户看的,要求格式,做格式处理
    也可以一块处理*/--1
    SELECT [单位名称] AS Name
    ,[库存年月] AS YearMonth
    ,SUM([含税单价]*[数量]) AS SaleAmt
    INTO #View1
    FROM #View
    GROUP BY [单位名称],[库存年月]
    --2
    DECLARE @Sql NVARCHAR(MAX),@Sql1 NVARCHAR(MAX)
    SELECT @Sql=ISNULL(@Sql+',','')+'['+YearMonth+']' FROM #View1 GROUP BY YearMonthSELECT @Sql1=ISNULL(@Sql1+',','')+'ISNULL('+'['+YearMonth+']'+',0) AS '+'['+YearMonth+N'销售额'+']' FROM #View1 GROUP BY YearMonthSELECT @Sql=N'SELECT Name AS [单位名称],'+@Sql1+'
                 FROM #View1 a 
                 PIVOT(MAX(SaleAmt) FOR YearMonth IN('+@Sql+')) p'      
    EXEC(@Sql)DROP TABLE #View
    DROP TABLE #View1--结果:
    /*
    单位名称 201304销售额 201305销售额 201306销售额
    A 615.00 2624.00 0.00
    B 2165.00 1938.00 2736.00
    C 1065.00 345.00 336.00
    D 334.00 704.00 1078.00
    */
      

  3.   

    try this,CREATE PROCEDURE dbo.cdh_hechunyeartest
    (@key nvarchar(50),
     @year nvarchar(50))
    as
    begin
     set nocount on
     declare @tsql varchar(6000) select @tsql=isnull(@tsql+',','')
                 +'sum(case when 库存年月='''
                 +@year+case len(number) when 1 then '0'+rtrim(number) else rtrim(number) end
                 +''' then 含税单价*数量 else 0 end) '''
                 +@year+case len(number) when 1 then '0'+rtrim(number) else rtrim(number) end+'销售额'' '
      from master.dbo.spt_values
      where type='P' and number between 1 and 12 select @tsql='SELECT 单位名称,'+@tsql
                 +' FROM dbo.VIEW2 GROUP BY 单位名称 ' exec(@tsql)
    end