在新列中汇总和分组的SQL查询

时间:2013-12-03 16:37:34

标签: sql group-by sum case

我有两个表格,我想比较一些值,但我还没弄清楚如何正确使用代码。

这是我拥有的两张桌子:

表1 (每月运行的费用)

id    amount     name     start                  end
1     500        Text 1   2013-09-01 00:00:00    2013-10-31 00:00:00
2     800        Text 2   2013-10-01 00:00:00    2013-10-31 00:00:00
3     200        Text 3   2013-09-01 00:00:00    2013-11-30 00:00:00

表2 (发票)

id    table1id   amount   month
51    1          100      201309
52    1          300      201309
53    1          500      201310
54    2          900      201310
55    3          300      201309
56    3          200      201310
57    3          250      201311

我想要的是一个看起来像这样的表:

Table1id name    SepTable2  SepTable1  OctTable2  OctTable1  NovTable2  NovTable1
1        Text 1  400        500        500        500
2        Text 2                        900        800
3        Text 3  300        200        200        200        250        200

到目前为止,我已成功实现了这一目标:

Table1id   name    SepTable1  OctTable1  NovTable1
1          Text 1  500        500        500
2          Text 2             800
3          Text 3  200        200        200

使用如下代码:

SELECT 
table1.id AS table1id,
table1.name,

case when table1.start < '2013-09-30 23:59:59' 
and table1.end > '2013-09-01 00:00:01'
then table1.amount
else '' end AS SepTable1,

case when table1.start < '2013-10-31 23:59:59' 
and table1.end > '2013-10-01 00:00:01'
then table1.amount
else '' end AS OctTable1,

case when table1.start < '2013-11-30 23:59:59' 
and table1.end > '2013-11-01 00:00:01'
then table1.amount
else '' end AS NovTable1

from Table1

INNER JOIN Table2 ON Table1.id = Table2.Table1id

我需要的是一种方法来获取Table2中所有条目的总和,其中Table1id是相同的,并且月份是相同的,以分组和总结并进入新列中的正确位置...我无法弄清楚如何做到正确。我认为GROUP BY和SUM会以某种方式参与其中,但我在这里迷失了,我已经尝试谷歌它几个小时而没有找到好的结果(我可能使用了错误的搜索字符串)。

如果有人能帮助我解决这个问题,或者只是给我一些可以指出我正确方向的建议,我将非常感激。

2 个答案:

答案 0 :(得分:0)

好吧,根据你不关心这一年的评论,这会得到你正在寻找的结果:

SELECT c.id, c.name,
  SUM(CASE WHEN i.month = 201309 THEN
    COALESCE(i.amount, 0)
  END) SepInvoices,
  MAX(CASE WHEN c.start < '2013-10-01 00:00:00' AND c.end >= '2013-09-01 00:00:00' THEN
    c.amount
  END) SepCosts
FROM costs c
LEFT JOIN invoices i ON c.id = i.costid
GROUP BY c.id, c.name

当然,在其他月份应用相同的逻辑。

查看小提琴here

答案 1 :(得分:0)

通常,最好将行添加到结果集而不是列。关键是要根据需要收集数据。演示文稿通常不是SQL适合的任务。考虑到这一点,我建议你应该试图获得的输出是这样的:

Table1id Month name    Table2  Table1
1        Sep   Text 1  400     500
1        Oct   Text 1  500     500
1        Nov   Text 1 
2        Sep   Text 1  
2        Oct   Text 1  900     800
2        Nov   Text 1 
3        Sep   Text 1  300     200
3        Oct   Text 2  200     200
3        Nov   Text 3  250     200

这非常简单(我使用的是Oracle语法,因为你没有指定数据库):

select table1id, 
       to_Date(to_date(table2.month||'01','YYYYMMDD'),'mmm') as Month, 
       table1.name, 
       table2.amount as table2, 
       table1.amount as table1 
from table2 
join table1 
on to_date(table2.month||'01','YYYYMMDD') <= table1.end
   and last_day(to_date(table2.month||'01','YYYYMMDD')) >= table1.end
   and table1.id = table2.table1id