连接每个不同行的表和SUM列,其中一些行被视为列

时间:2010-12-30 12:20:23

标签: sql sql-server

我有两张桌子

表1

id1  | total_amount| final_amount| p_id
---------------------------------------
1    |  500        |    505      |  10
2    |  700        |    710      |  20
3    |  400        |    400      |  10
4    |  450        |    460      |  20
5    |  300        |    300      |  10

表2

id2    | month  | amount | id1
------------------------------
1      |  jan   |  300   |  1
2      |  feb   |  200   |  1
3      |  jan   |  200   |  2
4      |  feb   |  500   |  2
5      |  feb   |  400   |  3
6      |  jan   |  150   |  4
7      |  feb   |  300   |  4
8      |  jan   |  300   |  5

这里tatal_amount列值是条件的总和(金额)为id1 而final_amount来自total_amount +(某些虚拟值)

所以从这些表中得到的结果如下。

id3 | p_id  | jan | feb | total
-------------------------------
1   |  10   | 600 | 600 | 1205
2   |  20   | 350 | 800 | 1170

此处jan中的值,feb列是table2中的金额之和,而total column中的值是table1中final_amount的总和,并且所有列都是p_id的组 那么什么是上面输出的查询。 如果你知道那么请回复......

1 个答案:

答案 0 :(得分:0)

您没有声明RDBMS。

以下适用于SQL Server

WITH table1(id1, total_amount, final_amount, p_id)
     AS (SELECT 1,500,505,10 UNION ALL
         SELECT 2,700,710,20 UNION ALL
         SELECT 3,400,400,10 UNION ALL
         SELECT 4,450,460,20 UNION ALL
         SELECT 5,300,300,10),
     table2(id2, month, amount, id1)
     AS (SELECT 1,'jan',300,1 UNION ALL
         SELECT 2,'feb',200,1 UNION ALL
         SELECT 3,'jan',200,2 UNION ALL
         SELECT 4,'feb',500,2 UNION ALL
         SELECT 5,'feb',400,3 UNION ALL
         SELECT 6,'jan',150,4 UNION ALL
         SELECT 7,'feb',300,4 UNION ALL
         SELECT 8,'jan',300,5),
     t1
     AS (SELECT p_id,SUM(final_amount) AS total_amount
         FROM   table1
         GROUP  BY p_id),
     t2
     AS (SELECT p_id,
                SUM(CASE WHEN month = 'jan' THEN amount END) AS jan,
                SUM(CASE WHEN month = 'feb' THEN amount END) AS feb
         FROM   table2
                JOIN table1
                  ON table1.id1 = table2.id1
         GROUP  BY p_id)
SELECT Row_number() OVER (ORDER BY (SELECT 0)) AS id3,t1.p_id,jan,feb,
       total_amount
FROM   t1
       JOIN t2
         ON t1.p_id = t2.p_id