有个表,结构是这样的
批号 类别  商品 费用名称  金额 。。
1001  1     A    人工费    10
1001  1     A    材料费    20
1002  2     B    人工费    30
1002  2     B    材料费    40现在要查询出这样的结果
批号 类别  商品  人工费  材料费
1001  1     A      10      20 
1002  2     B      30      40请问下该如何写SQL语句?      

解决方案 »

  1.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([批号] int,[类别] int,[商品] varchar(1),[费用名称] varchar(6),[金额] int)
    insert [tb]
    select 1001,1,'A','人工费',10 union all
    select 1001,1,'A','材料费',20 union all
    select 1002,2,'B','人工费',30 union all
    select 1002,2,'B','材料费',40
     
    declare @sql varchar(8000)
    select @sql=isnull(@sql+',','')+'sum(case when 费用名称='''+费用名称+''' then 金额 else 0 end) as ['+费用名称+']'
    from(select distinct 费用名称 from tb) a
    exec ('select 批号,类别,商品,'+@sql+' from tb group by 批号,类别,商品')/**
    批号          类别          商品   材料费         人工费
    ----------- ----------- ---- ----------- -----------
    1001        1           A    20          10
    1002        2           B    40          30(2 行受影响)
    **/
      

  2.   

    --> 测试数据: #TB
    if object_id('tempdb.dbo.#TB') is not null drop table #TB
    GO 
    create table #TB (批号 int,类别 int,商品 varchar(1),费用名称 varchar(6),金额 int)
    insert into #TB
    select 1001,1,'A','人工费',10 union all
    select 1001,1,'A','材料费',20 union all
    select 1002,2,'B','人工费',30 union all
    select 1002,2,'B','材料费',40select 批号, 类别, 商品,
     人工费=SUM(CASE WHEN  费用名称='人工费' THEN 金额 ELSE  0 END),
     材料费=SUM(CASE WHEN  费用名称='材料费' THEN 金额 ELSE  0 END)
     from #TB
    GROUP BY 批号, 类别, 商品批号          类别          商品   人工费         材料费
    ----------- ----------- ---- ----------- -----------
    1001        1           A    10          20
    1002        2           B    30          40(2 行受影响)
      

  3.   


    select 批号 ,类别,商品,
           sum(case 费用名称 when '人工费' then else 0 end) [人工费],
           sum(case 费用名称 when '材料费' then else 0 end) [材料费]
    from tb group by 批号 ,类别,商品
      

  4.   

    create table #TB (批号 int,类别 int,商品 Nvarchar(1),费用名称 Nvarchar(6),金额 int)
    insert into #TB
    select 1001,1,'A',N'人工费',10 union all
    select 1001,1,'A',N'材料费',20 union all
    select 1002,2,'B',N'人工费',30 union all
    select 1002,2,'B',N'材料费',40
    SELECT [批号],[类别],[商品],[人工费],[材料费] FROM #TB
    PIVOT(MAX(金额) FOR 费用名称 IN([人工费],[材料费]))PVT批号          类别          商品   人工费         材料费
    ----------- ----------- ---- ----------- -----------
    1001        1           A    10          20
    1002        2           B    30          40(2 row(s) affected)
      

  5.   

    IF object_id('tempdb.dbo.#') is not null 
    DROP TABLE #
    GO 
    CREATE TABLE # (批号 INT, 类别 INT, 商品 VARCHAR(1),费用名称 VARCHAR(32),金额 INT)
    INSERT INTO #
    SELECT 1001,1,'A','人工费',10 UNION ALL
    SELECT 1001,1,'A','材料费',20 UNION ALL
    SELECT 1002,2,'B','人工费',30 UNION ALL
    SELECT 1002,2,'B','材料费',40SELECT *
    FROM #
    PIVOT(SUM(金额) FOR 费用名称 IN([人工费],[材料费])) AS pvt
    批号          类别          商品   人工费         材料费
    ----------- ----------- ---- ----------- -----------
    1001        1           A    10          20
    1002        2           B    30          40
      

  6.   

    IF object_id('tempdb.dbo.#') is not null 
    DROP TABLE #
    GO 
    CREATE TABLE # (批号 INT, 类别 INT, 商品 VARCHAR(1),费用名称 VARCHAR(32),金额 INT)
    INSERT INTO #
    SELECT 1001,1,'A','人工费',10 UNION ALL
    SELECT 1001,1,'A','材料费',20 UNION ALL
    SELECT 1002,2,'B','人工费',30 UNION ALL
    SELECT 1002,2,'B','材料费',40DECLARE @Sql VARCHAR(max);SELECT @Sql = '';SELECT @Sql = @Sql +  费用名称 + ',' FROM (SELECT DISTINCT 费用名称 FROM #) tIF LEN(@Sql) > 1 
    SET @Sql = LEFT(@Sql, LEN(@Sql) - 1);
    print @SqlSET @Sql='SELECT * FROM # 
    PIVOT(SUM(金额) FOR 费用名称 IN(' + @Sql + ')) AS pvt'EXECUTE(@Sql)