SQL SUM Group by - 基于来自另一个表的'group'

时间:2017-05-16 09:42:03

标签: sql sql-server group-by sum

我希望我能正确解释这一点。

我有两张桌子,

第一个表格(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),table2Date在最后的决赛桌中总计(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查询实现此目的?

修改

行。看来这很简单。对我感到羞耻。我不知道joinGroup By可以这样应用。 SQL非常棒。这节省了大量的编码。

4 个答案:

答案 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