SQL来计算净容量

时间:2016-07-19 20:31:28

标签: sql sql-server

如何通过使用容量(状态为1或2)并减去每个月的总容量(状态为3)来编写SQL以获得容量的净变化?谢谢。这是表格:

STATUS        MONTH    CAPACITY     
1                01/16     5        
3                01/16     2        
1                02/16     11       
3                02/16     20       
1                03/16      8       
3                03/16     12       
1                04/16      4       
2                04/16     10       
3                04/16     18       
2                05/16     14       
3                05/16     37       
2                06/16      4       
3                06/16      8       

例如,1月16日的净容量变化为5减2等于3。

6 个答案:

答案 0 :(得分:5)

您需要一个条件总和:

SUM(CASE WHEN STATUS IN (1,2) THEN CAPACITY ELSE 0 END) -
SUM(CASE WHEN STATUS IN (3)   THEN CAPACITY ELSE 0 END)

答案 1 :(得分:2)

dnoeth的答案可以简化为

SUM(CASE WHEN STATUS IN (1,2) THEN CAPACITY WHEN STATUS IN (3) THEN -CAPACITY ELSE 0 END)

答案 2 :(得分:1)

构建于1,2< 3

select MONTH, [Net change]=SUM(CASE STATUS/3 WHEN 0 THEN CAPACITY ELSE -CAPACITY END)
from t
group by MONTH;

答案 3 :(得分:0)

您可以将表连接到自身并执行如下计算:

SELECT
   a.status,
   a.month,
   a.capacity,
   b.capacity AS total_capacity,
   a.capacity - b.capacity AS net_capacity
FROM
   table a
JOIN
   table b
   ON (a.month = b.month)
   AND (b.status = 3)
WHERE
   a.status IN (1,2);

- 如果您不想拥有该状态,而是在同一个月内有两个聚合:

SELECT
   a.month,
   SUM(a.capacity) AS capacity,
   SUM(b.capacity) AS total_capacity,
   SUM(a.capacity) - MAX(b.capacity) AS net_capacity
FROM
   table a
JOIN
   table b
   ON (a.month = b.month)
   AND (b.status = 3)
WHERE
   a.status IN (1,2)
GROUP BY
   a.month;

答案 4 :(得分:0)

没有CASE声明:

select month, sum(capacity)-2*sum((status/3)*capacity) from table group by month;

Here is an example

答案 5 :(得分:0)

SELECT
  "Status",
  "Month",
  SUM(Capacity) AS Capacity
FROM ( SELECT
         "Status",
         "Month",
         CASE WHEN Status = 3 THEN -1 * Capacity ELSE Capacity END AS Capacity FROM tbl
     ) t
GROUP BY
  "Status",
  "Month"