1

次のようなテーブルがあります。

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

OpType に応じて SUM(Quantity) が必要です。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
4

2 に答える 2

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 ║
╚══════╩════╩═════╩═══════╝
于 2013-04-25T14:44:10.223 に答える
1

各列の SUM 内でCASEステートメントを使用して、目的の値のみを合計するようにします (つまり、IN 列の場合は OpType='IN' で数量を合計し、OUT 列の場合は OpType= で数量を合計します)。 'アウト')

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 웃 の回答へのコメントで、2 つの日付間の 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
于 2013-04-25T14:52:52.433 に答える