有两张表
第一张
ID 付款方式 付款金额
1 001 现金
2 002 银行卡
2 003 支票
第二张
------------------------------------------
ID 商家 付款方式 付款金额
1 1001 001 100
2 1001 002 200
3 1001 003 300
4 1002 001 150
5 1002 003 250
要求获取以下结果
生成如下统计(付款方式可以随时变化)
ID 商家 总金额 现金 银行卡 支票
1 1001 600 100 200 300
2 1002 400 150 0 250
怎么做啊
第一张
ID 付款方式 付款金额
1 001 现金
2 002 银行卡
2 003 支票
第二张
------------------------------------------
ID 商家 付款方式 付款金额
1 1001 001 100
2 1001 002 200
3 1001 003 300
4 1002 001 150
5 1002 003 250
要求获取以下结果
生成如下统计(付款方式可以随时变化)
ID 商家 总金额 现金 银行卡 支票
1 1001 600 100 200 300
2 1002 400 150 0 250
怎么做啊
go
create table [ta](id int, 付款方式 varchar(3),付款金额 nvarchar(10))
insert [ta]
select 1 ,'001', '现金' union all
select 2 ,'002', '银行卡' union all
select 2 ,'003', '支票'
goif object_id('[tb]') is not null drop table [tb]
go
create table [tb](id int,商家 varchar(4), 付款方式 varchar(3),付款金额 int)
insert [tb]
select 1 ,'1001','001', '100' union all
select 2 ,'1001','002', '200' union all
select 3 ,'1001','003', '300' union all
select 4 ,'1002','001', '150' union all
select 5 ,'1002','003', '250'
godeclare @sql varchar(8000)
set @sql = ''
select @sql = @sql + ' , max(case b.付款方式 when ''' + 付款方式 + ''' then b.付款金额 else 0 end) [' + 付款金额 + ']'
from ta
set @sql = 'select right(b.商家,1)id,b.商家,sum(b.付款金额)总金额'+@sql + ' from tb b join ta a on a.付款方式=b.付款方式 group by right(b.商家,1),商家'
exec(@sql) --结果
/*
id 商家 总金额 现金 银行卡 支票
---- ---- ----------- ----------- ----------- -----------
1 1001 600 100 200 300
2 1002 400 150 0 250(所影响的行数为 2 行)*/
--DROP TABLE dbo.tableA,dbo.tableB
CREATE TABLE tableA(ID VARCHAR(10), 付款方式 VARCHAR(10),付款金额 VARCHAR(10))
INSERT INTO tableA VALUES(1,'001','现金')
INSERT INTO tableA VALUES(2,'002','银行卡')
INSERT INTO tableA VALUES(3,'003','支票')CREATE TABLE tableB (ID INT, 商家 INT, 付款方式 VARCHAR(10), 付款金额 INT)
INSERT INTO tableB VALUES (1, 1001, '001', 100)
INSERT INTO tableB VALUES (2, 1001, '002', 200)
INSERT INTO tableB VALUES (3, 1001, '003', 300)
INSERT INTO tableB VALUES (4, 1002, '001', 150)
INSERT INTO tableB VALUES (5, 1002, '003', 250)GODECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT ROW_NUMBER() OVER (ORDER BY 总金额) AS ID,* FROM (SELECT B.商家,SUM(B.付款金额)AS 总金额'
SELECT @sql = @sql + ',SUM(CASE WHEN B.付款方式 = ''' + 付款方式 + ''' THEN B.付款金额 ELSE 0 END) AS [' + 付款金额 + ']'
FROM (SELECT 付款方式,付款金额 FROM tableA)AS T
SELECT @sql = @sql + ' FROM tableB AS B INNER JOIN tableA AS A ON A.付款方式 = B.付款方式 GROUP BY B.商家)AS T'
PRINT @sql
EXEC(@sql)
INSERT INTO #tb1
SELECT '001','现金' UNION ALL
SELECT '002','银行卡' UNION ALL
SELECT '003','支票'CREATE TABLE #tb2(id INT IDENTITY,商家 VARCHAR(10) ,付款方式 VARCHAR(10),付款金额 FLOAT)
INSERT INTO #tb2
SELECT '1001','001',100 UNION ALL
SELECT '1001','002',200 UNION ALL
SELECT '1001','003',300 UNION ALL
SELECT '1002','001',150 UNION ALL
SELECT '1002','003',250
DECLARE @sql VARCHAR(8000);
SET @sql = 'SELECT b.商家';
SELECT @sql = @sql + ',sum(case a.付款金额 when ''' + a.付款金额+ ''' then b.付款金额 else 0 end) as ' + a.付款金额
FROM ( SELECT DISTINCT(付款金额) FROM #tb1
) AS a;
SET @sql=@sql+' ,sum(b.付款金额) as 总金额'
SET @sql=@sql+' FROM #tb1 a LEFT JOIN #tb2 b
ON a.付款方式=b.付款方式 GROUP BY b.商家'EXEC (@sql);