1

SQLServerのcaseステートメント内のcase式のwhen式でブール比較を実行することは可能ですか。次のようなロジックを持つSELECTステートメントがあります。

SELECT T1.ProductNumber,
    CASE
        WHEN (SELECT SUM(T2.Quantity) FROM Table2 AS T2 WHERE T2.Product=T1.Product) IS NULL
            THEN T1.Quantity
        WHEN (SELECT SUM(T2.Quantity) FROM Table2 AS T2 WHERE T2.Product=T1.Product) > T1.Quantity
            THEN T1.Quantity
        ELSE T1.Quantity - (SELECT SUM(T2.Quantity) FROM Table2 AS T2 WHERE T2.Product=T1.Product)
    END
FROM Table1 AS T1

これは、Table2で重複したルックアップがたくさんあるようです。可能であれば、次のようなことをしたいと思います。

SELECT T1.ProductNumber,
    CASE (SELECT SUM(T2.Quantity) FROM Table2 AS T2 WHERE T2.Product=T1.Product) as altQty
        WHEN altQty IS NULL
            THEN T1.Quantity
        WHEN altQty > T1.Quantity
            THEN T1.Quantity
        ELSE T1.Quantity - altQty
    END
FROM Table1 AS T1
4

3 に答える 3

4

そのようにエイリアスを参照することはできませんが、サブクエリ/派生テーブルに入れるとできます。

SELECT ProductNumber, CASE WHEN altQty IS NULL
            THEN Quantity
        WHEN altQty > Quantity
            THEN Quantity
        ELSE Quantity - altQty END
FROM 
(
  SELECT T1.ProductNumber, T1.Quantity, 
    altQty = (SELECT SUM(T2.Quantity) FROM Table2 AS T2 WHERE T2.Product=T1.Product)
  FROM Table1 AS T1
) AS x;
于 2012-07-18T13:50:17.813 に答える
3
SELECT T1.ProductNumber,
    CASE 
        WHEN T2.Qty IS NULL
            THEN T1.Quantity
        WHEN T2.Qty > T1.Quantity
            THEN T1.Quantity
        ELSE T1.Quantity - T2.Qty END
FROM Table1 AS T1
    LEFT JOIN (SELECT ProductNumber, SUM(Quantity) AS Qty FROM Table2 GROUP BY ProductNumber) AS T2
        ON T1.ProductNumber = T2.ProductNumber
于 2012-07-18T13:52:06.567 に答える
1

いいえ。ただし、重複したルックアップは削除できます。

SELECT ProductNumber,
       CASE WHEN T2Quantity IS NULL THEN T1Quantity
            WHEN T2Quantity > T1Quantity THEN T1Quantity
            ELSE T1Quantity - T2Quantity END
  FROM
   (SELECT T1.ProductNumber, T1.Quantity as T1Quantity, SUM(T2.Quantity) as T2Quantity
      FROM Table1 AS T1 LEFT OUTER JOIN 
           Table2 AS T2 ON T2.Product=T1.Product
     GROUP BY T1.ProductNumber) innerTbl
于 2012-07-18T13:50:58.803 に答える