有两张表
第一张
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
怎么做啊 

解决方案 »

  1.   

    先看这个,我再写个http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx
      

  2.   

    if object_id('[ta]') is not null drop table [ta]
    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 行)*/
      

  3.   


    --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)
      

  4.   

    'SELECT ROW_NUMBER() OVER (ORDER BY 总金额 DESC) AS ID
      

  5.   

    CREATE TABLE #tb1(id INT IDENTITY ,付款方式 VARCHAR(10),付款金额 VARCHAR(20))
    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);