有个表,结构是这样的
批号 类别 商品 费用名称 金额 。。
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语句?
批号 类别 商品 费用名称 金额 。。
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语句?
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 行受影响)
**/
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 行受影响)
select 批号 ,类别,商品,
sum(case 费用名称 when '人工费' then else 0 end) [人工费],
sum(case 费用名称 when '材料费' then else 0 end) [材料费]
from tb group by 批号 ,类别,商品
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)
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
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)