0

これは sql server 2005 にあります。 と の 2 つのテーブルがcustomersありordersます。パラメータを持つストアド プロシージャがありますminimumorders(0 または 0 より大きい値が可能な値です)。IF ELSE上記のようなブロックは避けて、CASEステートメントで行きたいです。コード内のブロックを回避するために句でCASEステートメントを使用する方法はありますか? 現時点では、両方の&ブロックで 5 行が繰り返されています。繰り返したくありません。以下のような問い合わせをお待ちしております。WHEREIF ELSEIFELSE

CREATE PROC STOREDPROC1
@MinimumOrders  INT AS IF @MinimumOrders = 0
BEGIN
    SELECT 
        CUSTOMERID 
        , (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
        FROM CUSTOMER C
ENDELSE IF @MinimumOrders = 1
BEGIN
    SELECT 
        CUSTOMERID 
        , (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
        FROM CUSTOMER C
            WHERE (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) > 0
END     

CASE次のようなステートメントが必要です。残念ながら私にはうまくいきません。

-------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday -------------------- 
    SELECT 
        CUSTOMERID 
        , (SELECT COUNT(ORDERID) FROM ORDERS O WHERE O.CUSTOMERID = C.CUSTOMERID) AS ORDERS
        FROM CUSTOMER C
        AND C.customerid=
            CASE @MiniumOrders
                WHEN 0 THEN C.CustomerID
                WHEN 1 THEN 
                    CASE  ( Select COUNT(O.CustomerID) FROM Orders O where O.Customerid = C.customerid    ) 
                        WHEN 0 THEN 0   -- customer id = 0 means no match
                            ELSE C.CustomerID
                    END 
                END 
        -------------------- 12/20/2011 -- 11:52:34 AM -- Tuesday -------------------- 
4

2 に答える 2

2

結合と HAVING 句の使用を検討してください。

SELECT
    C.Customer_ID,
    COUNT(O.Customer_ID) AS Orders
FROM
    Customers C
    LEFT JOIN Orders O
        ON C.Customer_ID = Orders.Customer_ID
GROUP BY C.Customer_ID
HAVING COUNT(O.Customer_ID) > @MinimumOrders
于 2011-12-20T20:50:58.263 に答える
0

ウィンドウCOUNT句の使用を検討してください。あなたの状況のすべての詳細を把握していないため、テスト ケース全体を含めました。気になる部分SELECTは一番下です。

DECLARE @Cust TABLE (
    CustID INT
)

DECLARE @Ord TABLE (
    OrdID INT IDENTITY (1,1),
    CustID INT,
    Qty INT,
    Price MONEY
)

INSERT INTO @Cust 
VALUES
(1),
(2),
(3),
(4)

INSERT INTO @Ord
VALUES
(1, 5, 5.55),
(2,3,3.33),
(2,4,3.22),
(3,4,1.23),
(3,5,5.66),
(3,7,1.22)

DECLARE @MinimumOrders INT = 0

SELECT
    C.CustID,
    CASE
        WHEN COUNT(O.OrdID) OVER(PARTITION BY C.CustID) > @MinimumOrders THEN COUNT(O.OrdID) OVER(PARTITION BY C.CustID)
        ELSE NULL
    END AS Orders,
    O.Qty,
    O.Price
FROM
    @Cust C
    LEFT JOIN @Ord O
        ON C.CustID = O.CustID
于 2011-12-23T06:03:01.170 に答える