我希望我能正确解释这一点。
我有两张桌子,
第一个表格(table1
)
+------------+------+-------+-------+
| Date | Item | Block | Total |
+------------+------+-------+-------+
| 2017-01 | a1 | B1 | 10.0 |
| 2017-01 | a2 | B1 | 20.0 |
| 2017-01 | a3 | B2 | 30.0 |
| 2017-02 | a1 | B1 | 40.0 |
| 2017-02 | a2 | B1 | 50.0 |
| 2017-02 | a3 | B2 | 60.0 |
+------------+------+-------+-------+
第二个表格(table2
)
+------------+------+
| Item Group | Item |
+------------+------+
| IG1 | a1 |
| IG1 | a2 |
| IG2 | a2 |
| IG2 | a3 |
+------------+------+
*Note that, one item group has multiple items.
The items may appear several time in different item groups.
现在,我需要根据项目组(table1
),table2
和Date
在最后的决赛桌中总计(Block
)总和:
+---------+------------+-------+-------+
| Date | Item Group | Block | Total |
+---------+------------+-------+-------+
| 2017-01 | IG1 | B1 | 30.0 |
| 2017-01 | IG2 | B1 | 20.0 |
| 2017-01 | IG1 | B2 | 0.0 |
| 2017-01 | IG2 | B2 | 30.0 |
+---------+------------+-------+-------+
如何使用SQL查询实现此目的?
修改
行。看来这很简单。对我感到羞耻。我不知道join
和Group By
可以这样应用。 SQL非常棒。这节省了大量的编码。
答案 0 :(得分:1)
在这种情况下,join
和简单的group by
应该适合您:
select t1.Date, t2.ItemGroup, t1.Block, sum(t1.Total) Total
from table1 t1 join table2 t2 on t1.Item = t2.Item
group by t1.Date, t2.ItemGroup, t1.Block
答案 1 :(得分:1)
加入后的简单分组
SELECT f.date, s.[Item Group], f.[Block], Total = sum(f.Total) from firsttable f
INNER JOIN secondtable s
ON f.item = s.item
GROUP BY f.date, s.[Item Group], f.[Block]
答案 2 :(得分:0)
我们可以使用Window子句Over()和Partition By来实现这一点。由于您的查询是直接的并且使用了select list和Group by子句中的所有列,因此我们可以使用简单的join和Group by子句。
无论如何,这里是使用Over Clause的查询:
select DISTINCT t1.dateyear, t2.ItemGroup, t1.Block,
sum(Total) over(PARTITION BY t2.ItemGroup, t1.dateyear, t1.Block) as GroupTotal
FROM tab_1 t1
JOIN tab_2 t2
ON t1.Item = t2.Item
答案 3 :(得分:0)
我有一个类似的问题。我想从基于另一个表的表中选择数据。
这就是我所拥有的:
表1
Articlename, group, status
表2
Articlename, date
这就是我想要的:
如果表1中的文章具有组并且状态为1,则对表2中的date1和date2之间的帖子进行计数,则按表1中的组对结果进行分组
结果应该像这样
Group Quantity
-----------------
GR1 250
GR2 50
GR3 110