我有一个看起来像这样的表:
+----+------+--------+----------+
| 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
答案 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