有一个表in_stock(月份mth,日期indate,编码stock_no名称stock_na)
月份----日期--------编码------名称--------进库数量
1          2012/1/2   001         TCL电视    5
1          2012/1/5   001         TCL电视    6
2          2012/2/6   001         TCL电视    10
1          2012/1/3   002         格力空调    20
1          2012/1/4   002         格力空调    20
2          2012/2/8   002         格力空调    30
...
用SELECT 语句怎么实现以下结果:
编码------名称--------1月份-----2月份------3月份....
001         TCL电视    11            10
002          格力空调   40            30
............................................................................

解决方案 »

  1.   

    USE test
    GO
     
     
     
    -->生成表in_stock
     
    if object_id('in_stock') is not null 
        drop table in_stock
    Go
    Create table in_stock([mth] smallint,[indate] datetime,[stock_no] nvarchar(3),[stock_name] nvarchar(5),[qty] smallint)
    Insert into in_stock
    Select 1,'2012/1/2',N'001',N'TCL电视',5
    Union all Select 1,'2012/1/5',N'001',N'TCL电视',6
    Union all Select 2,'2012/2/6',N'001',N'TCL电视',10
    Union all Select 1,'2012/1/3',N'002',N'格力空调',20
    Union all Select 1,'2012/1/4',N'002',N'格力空调',20
    Union all Select 2,'2012/2/8',N'002',N'格力空调',30
     
     
     
    DECLARE @col NVARCHAR(MAX)
     
    SELECT 
            @col=ISNULL(@col+',','')+'SUM(CASE WHEN mth='+LTRIM(mth)+' THEN qty END) As ['+LTRIM(mth)+'月份]'
        FROM in_stock
        GROUP BY mth
    EXEC ( N'SELECT [stock_no] As 编码,[stock_name] As 名称,'+@col+' FROM in_stock GROUP BY [stock_no],[stock_name]' )
     
    /*
    编码   名称    1月份     2月份
    ---- ----- ----------- -----------
    001  TCL电视 11          10
    002  格力空调  40          30
    */
      

  2.   

    select stock_no,stock_na,sum(case when mth=1 then jksl end)
    1月份,sum(case when mth=2 then jksl end) 2月份  from in_stock
    group by stock_no,stock_na
      

  3.   

    Group  by 语句可以。 
      

  4.   

    declare @sql varchar(2000)
    select @sql=isnull(@sql+',','')+'sum(case when mth='+ convert(varchar(2),mth)+' then qty else 0 end) '''+ convert(varchar(2),mth)+'月份''' 
    from in_stock group by mth
    exec('select [stock_no] 编码,[stock_name] 名称,'+@sql+' from in_stock group by stock_name, stock_no')
      

  5.   

    declare @sql nvarchar(1000)
    select @sql=isnull(@sql,'')+',sum(case when mth='+rtrim(mth)+' then qty else 0 end)月份'+rtrim(mth) from (select distinct mth from tb)t
    set @sql='select stock_no,stock_name'+@sql+' from tb group by stock_no,stock_name'
    exec (@sql)
      

  6.   


    修改一下select stock_no,stock_name,sum(case when mth=1 then qty end) '1月份',sum(case when mth=2 then qty end) '2月份'  from in_stock group by stock_no,stock_name