2012-02-22 19 views
0

我有這個查詢,當我向retailer_id參數提供一個值時,它完美地工作。SQL - 內聯選擇語句 - 當@retailer_id = null時發出

SELECT  reda.RetailerId, 
       ( SELECT  SUM(reda.Purchases) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS Purchases, 

       ( SELECT  SUM(reda.PurchaseTotal) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS PaymentsTotal, 

       ( SELECT  SUM(reda.Refunds) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS Refunds, 

       ( SELECT  SUM(reda.RefundTotal) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS RefundsTotal, 

       ( SELECT  SUM(reda.OffersOptedInto) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS OffersOptedInto, 

       ( SELECT  SUM(reda.RedeemedOffers) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS RedeemedOffers, 

       ( SELECT  SUM(reda.RedeemedOfferTotal) 
        FROM  RetailerDaily     reda 
        WHERE  (reda.RetailerId    = @retailer_id 
        OR   @retailer_id     IS NULL) 
        AND   (reda.DateStart     >= @date_from 
        OR   @date_from      IS NULL) 
        AND   (reda.DateStart     <= @date_to 
        OR   @date_to      IS NULL) 
        GROUP BY reda.RetailerId)         AS RedeemedOfferTotal 

    FROM  RetailerDaily              reda 

    WHERE  (reda.RetailerId             = @retailer_id 
    OR   @retailer_id              IS NULL) 
    AND   (reda.DateStart              >= @date_from 
    OR   @date_from               IS NULL) 
    AND   (reda.DateStart              <= @date_to 
    OR   @date_to               IS NULL) 

    GROUP BY reda.RetailerId 

然而,當我在retailer_id通過爲空我收到以下錯誤消息

Msg 512, Level 16, State 1, Line 9 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

任何人都可以提供一些線索到如何解決這個問題,我似乎無法工作了。

在此先感謝

史蒂芬

+0

這是預期的行爲。 – 2012-02-22 10:10:57

回答

1

如前所述,這是預期的行爲。您使用子查詢作爲表達式,並且它們只允許返回單個值。如果你傳入NULL,它們將產生多個值。

爲什麼在地球上你甚至使用這麼多的子查詢?您的查詢可以簡化如下:

SELECT  RetailerId, 
      SUM(Purchases) AS Purchases, 
      SUM(PurchaseTotal) AS PaymentsTotal, 
      SUM(Refunds) AS Refunds, 
      SUM(RefundTotal) AS RefundsTotal, 
      SUM(OffersOptedInto) AS OffersOptedInto, 
      SUM(RedeemedOffers) AS RedeemedOffers, 
      SUM(RedeemedOfferTotal) AS RedeemedOfferTotal 

    FROM  RetailerDaily 

    WHERE  (RetailerId = @retailer_id 
    OR   @retailer_id IS NULL) 
    AND   (DateStart >= @date_from 
    OR   @date_from IS NULL) 
    AND   (DateStart <= @date_to 
    OR   @date_to IS NULL) 

    GROUP BY RetailerId 
+0

乾杯夥計,我以前有過這種情況,但沒有注意到第一次的小差異非常感謝他們的幫助 – swade1987 2012-02-22 10:39:34

0

您使用GROUP BY reda.RetailerId如果有多個RetailerId的它會返回多個記錄,所以by子句中刪除組。

+0

我從內嵌select語句中刪除了group by子句,但是現在每個返回的記錄都顯示相同的值,只會發生一個唯一的RetailerId – swade1987 2012-02-22 10:23:01

+0

,您將該變量作爲null傳遞,因此結果將如何變化?它會顯示總數。 – Vikram 2012-02-22 10:26:31

+0

OP顯然不希望總金額,而是每個零售商的總和。因此,在刪除GROUP BY子句的同時會使錯誤消失,同時也會導致結果無用。 – Feysal 2012-02-22 10:31:19