SQL SUM()条件问题

时间:2013-04-25 14:37:16

标签: sql-server group-by sum

我有一个看起来像这样的表:

+----+------+--------+----------+
| ID | Code | OpType | Quantity |
+----+------+--------+----------+
|  0 | A    | IN     |        7 |
|  1 | B    | IN     |        8 |
|  2 | A    | OUT    |        2 |
|  3 | B    | IN     |        7 |
|  4 | B    | OUT    |       12 |
+----+------+--------+----------+

我希望SUM(数量)取决于OpType。当OpType为OUT时,Quantity字段应乘以-1。

查询结果应为:

Code   IN   OUT   Final
A      7    2     5
B      15   12    3

我试过这个,但它不起作用:

SELECT(SELECT SUM(Quantity) FROM Table WHERE OpType = 'IN') AS[IN], (SELECT SUM(Quantity) FROM Table WHERE OpType = 'OUT') AS[OUT], (SELECT SUM(Quantity) FROM Table WHERE OpType = 'IN') - (SELECT SUM(Quantity) FROM Table WHERE OpType = 'OUT') AS[Final]
FROM Table
GROUP BY Code

2 个答案:

答案 0 :(得分:1)

SQL Server具有PIVOT功能。

SELECT  [Code], [IN], [OUT], [IN] - [OUT] AS [Final]
FROM
        (
            SELECT  [Code], OpType, SUM(Quantity) Quantity
            FROM    TableName
            GROUP   BY [Code], OpType
        ) org
        PIVOT
        (
            MAX(Quantity)
            FOR OpType IN ([IN],[OUT])
        ) pvt

输出

╔══════╦════╦═════╦═══════╗
║ CODE ║ IN ║ OUT ║ FINAL ║
╠══════╬════╬═════╬═══════╣
║ A    ║  7 ║   2 ║     5 ║
║ B    ║ 15 ║  12 ║     3 ║
╚══════╩════╩═════╩═══════╝

答案 1 :(得分:1)

我会在每个列的SUM中使用CASE语句,以便您只对所需的值求和(即对于IN列,仅将OpType ='IN'的数量和仅OUT列的数量相加使用OpType ='OUT')

来计算数量
SELECT Code, 
    SUM(CASE WHEN OpType = 'IN' THEN Quantity ELSE 0 END) as [IN],
    SUM(CASE WHEN OpType = 'OUT' THEN Quantity ELSE 0 END) as [OUT],
    SUM(CASE WHEN OpType = 'OUT' THEN -1 * Quantity ELSE Quantity END) as [FINAL]
FROM Table
GROUP BY Code

更新:在对JW웃的回答的评论中,你询问了两个日期之间的IN,OUT和FINAL总和。下面是一个更新的查询,它将执行此操作。

DECLARE @InitialSumDate DATETIME = '4/22/2013', @EndDate DATETIME = '4/23/2013'
SELECT 
    @InitialSumDate as [InitialSumDate], @EndDate as [EndDate],
    Code, 
    SUM(CASE WHEN PurchaseDate <= @InitialSumDate AND OpType = 'OUT' THEN -1 * Quantity WHEN PurchaseDate <= @InitialSumDate AND OpType = 'IN' THEN Quantity ELSE 0 END) as [InitialSum],
    SUM(CASE WHEN PurchaseDate >  @InitialSumDate AND PurchaseDate <= @EndDate AND OpType = 'IN'  THEN Quantity ELSE 0 END) as [IN],
    SUM(CASE WHEN PurchaseDate >  @InitialSumDate AND PurchaseDate <= @EndDate AND OpType = 'OUT' THEN Quantity ELSE 0 END) as [OUT],
    SUM(CASE WHEN OpType = 'OUT' AND PurchaseDate <= @EndDate THEN -1 * Quantity WHEN OpType = 'IN' AND PurchaseDate <= @EndDate THEN Quantity ELSE 0 END) as [FINAL]
FROM #Table
GROUP BY Code
相关问题