子查询中一组数字的总和

时间:2018-11-01 12:24:07

标签: sql-server tsql sum max min

我们正在尝试获取一个组合表,在此我们还尝试对音量进行求和。

现在的日期集:

+-------------+-----+------------+------------+--------+---------+
| Voorziening | BSN | Begindatum | Einddatum  | Volume | Product |
+-------------+-----+------------+------------+--------+---------+
| 1000        |  1  |  1-1-2017  | 31-1-2017  |   50   |   AAAA  |
+-------------+-----+------------+------------+--------+---------+
| 1200        |  1  |  1-2-2017  | 31-3-2017  |   200  |   AAAA  |
+-------------+-----+------------+------------+--------+---------+
| 1250        |  1  |  1-4-2017  | 10-4-2017  |   90   |   AAAA  |
+-------------+-----+------------+------------+--------+---------+
| 1111        |  2  |  4-1-2017  | 10-1-2017  |   4    |   AABB  |
+-------------+-----+------------+------------+--------+---------+
| 1345        |  2  |  11-1-2017 | 29-1-2017  |   80   |   AABB  |
+-------------+-----+------------+------------+--------+---------+
| 2000        |  1  |  10-1-2017 | 31-1-2017  |   90   |   CCCC  |
+-------------+-----+------------+------------+--------+---------+
| 2190        |  1  |  1-2-2017  | 31-12-2017 |   100  |   CCCC  |
+-------------+-----+------------+------------+--------+---------+

我想实现的目标

+-------------+-----+------------+------------+--------+---------+
| Voorziening | BSN | Begindatum | Einddatum  | Volume | Product |
+-------------+-----+------------+------------+--------+---------+
| 1000        |  1  |  1-1-2017  | 10-4-2017  |   340  |  AAAA   |
+-------------+-----+------------+------------+--------+---------+
| 2000        |  1  |  10-1-2017 | 31-12-2017 |   190  |  CCCC   |
+-------------+-----+------------+------------+--------+---------+
| 1111        |  2  |  4-1-2017  | 29-1-2017  |   84   |  AABB   |
+-------------+-----+------------+------------+--------+---------+

我这样做是为了以下查询:

SELECT  min(b.Voorziening) as voorzieningsnummer
,a.BSN
,min(b.Begindatum) as mindatum
,MAX(b.Einddatum) AS maxdatum
,a.Productcode
,
(SELECT sum(Volume)
FROM Voorziening
)as totaal
FROM Voorziening a
INNER JOIN Voorziening b
ON a.BSN = b.BSN
AND a.Productcode = b.Productcode
GROUP BY a.BSN, a.Productcode

结果是给我的是这样:

+-------------+-----+------------+------------+--------+
| Voorziening | BSN | Begindatum | Einddatum  | Volume |
+-------------+-----+------------+------------+--------+
| 1000        |  1  |  1-1-2017  | 10-4-2017  |   424  |
+-------------+-----+------------+------------+--------+
| 1111        |  2  |  4-1-2017  | 29-1-2017  |   424  |
+-------------+-----+------------+------------+--------+

你们可以帮助我弄清总额吗?

2 个答案:

答案 0 :(得分:4)

没有任何理由使用JOIN。您可以直接使用聚合函数。

您可以尝试一下。

SELECT  min(a.Voorziening) as voorzieningsnummer
        ,a.BSN
        ,min(a.Begindatum) as mindatum
        ,MAX(a.Einddatum) AS maxdatum
        ,a.Productcode
        ,SUM(a.Volume) Volume 
FROM Voorziening a
GROUP BY a.BSN, a.Productcode

答案 1 :(得分:0)

如果您使用的是sql server 2008或更高版本,则只需继续PARTITION BY

SUM(Volume)over(Partition by Product order by Voorziening,another,another)