我有两个表格,我想比较一些值,但我还没弄清楚如何正确使用代码。
这是我拥有的两张桌子:
表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会以某种方式参与其中,但我在这里迷失了,我已经尝试谷歌它几个小时而没有找到好的结果(我可能使用了错误的搜索字符串)。
如果有人能帮助我解决这个问题,或者只是给我一些可以指出我正确方向的建议,我将非常感激。
答案 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