2015-07-20 58 views
3

我有兩個單獨的查詢,自己工作正常,但我需要他們在一個查詢工作。我可以在excel中輕鬆地組合結果,但這是更大查詢的一部分。兩個計數在一個查詢與反對哪裏條件

的兩個單獨的查詢是:

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1 
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 0) 
GROUP BY 
    SiteProductVariation.ProductVariationID 

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1 
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 1) 
GROUP BY 
    SiteProductVariation.ProductVariationID 

對於本ProductVariationID有11個Siteproductids,7 Productdisplay = 1和4 ProductDisplay = 0,並且這些查詢做返回那信息很好。

但我試圖將它們組合成:

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1, 
    COUNT(SiteProduct_1.SiteProductID) AS Expr2 
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
INNER JOIN 
    SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID 
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 0) 
    AND (SiteProduct_1.ProductDisplay = 1) 
GROUP BY 
    SiteProductVariation.ProductVariationID 

,並沒有結果。我認爲這是因爲當我看到這個問題時使用group。

即使說我不能這樣做,任何幫助都很感激。 ProductDisplay等於1或0的結果可能有0個結果,因此可能需要考慮。提前致謝。

+0

添加到已經給出了答案:通過使用兩個內部連接,你只能得到既有SiteProduct紀錄ProductDisplay = 0 SiteProductVariations和一個是ProductDisplay = 1。你可以使用左外部連接,將ProductDisplay條件移動到ON子句並計算不同的ID,但是如Cetin Basoz所示僅查詢一次表格會好得多(只有在那裏給出的解釋不準確)。 –

+0

「給出的解釋不準確」???你認爲一個像這樣簡單的SQL需要任何解釋嗎? –

+0

@Cetin Basoz:對不起,冒犯意味着:-)「價值不能同時爲0和1」是錯誤的。很可能一個SiteProductVariation存在兩個SiteProduct記錄,一個存儲ProductDisplay 0,一個存儲爲1.因此,您沒有真正解釋OP的查詢出了什麼問題。但是你的解決方案很好。 –

回答

2
SELECT  SiteProductVariation.ProductVariationID 
     , COUNT(CASE WHEN SiteProduct.ProductDisplay = 0 THEN SiteProduct.SiteProductID END) AS Expr1 
     , COUNT(CASE WHEN SiteProduct.ProductDisplay = 1 THEN SiteProduct.SiteProductID END) AS Expr2 
FROM SiteProductVariation 
INNER JOIN SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 0 
     OR 
     SiteProduct.ProductDisplay = 1) 
GROUP BY SiteProductVariation.ProductVariationID 
+0

獲得2行,那麼替代向SQL本身添加SiteProduct_1.ProductDisplay到SQL本身的UNION會更簡單。您的解決方案很好,除了它指的是不存在的SiteProduct_1別名。我也被同樣的誤解所困擾:)它只是SIteProduct.ProductDisplay –

+0

@CetinBasoz乾杯隊友:) –

+0

謝謝你,這工作完美。我刪除了AND(SiteProduct.ProductDisplay = 0或SiteProduct_1.ProductDisplay = 1),因爲0和1是它可以進入的唯一的兩個狀態。我將它應用於一個更大的查詢,這是它的一部分,並且在CASE之前添加了DISTINCT由於其加入的方式,它也工作。 – Georgie

0

將第一個版本修改爲使用IN。此外,使用表的別名簡化查詢:

SELECT spv.ProductVariationID, COUNT(sp.SiteProductID) AS Expr1 
FROM SiteProductVariation spv INNER JOIN 
    SiteProduct sp 
    ON sp.SiteProductID = spv.SiteProductID 
WHERE (spv.ProductVariationID = 159868) AND 
     (sp.ProductDisplay IN (0, 1)) 
GROUP BY spv.ProductVariationID; 

作爲一個說明:您的版本將與OR兩個條件之間的ProductDisplay而非AND工作。

如果你想與分離ProductDisplay值的結果,那麼包括在SELECTGROUP BY

SELECT spv.ProductVariationID, sp.ProductDisplay, 
     COUNT(sp.SiteProductID) AS Expr1 
FROM SiteProductVariation spv INNER JOIN 
    SiteProduct sp 
    ON sp.SiteProductID = spv.SiteProductID 
WHERE (spv.ProductVariationID = 159868) AND 
     (sp.ProductDisplay IN (0, 1)) 
GROUP BY spv.ProductVariationID, sp.ProductDisplay; 
+0

這將返回總計數在SiteProduct.ProductDisplay是0或1.我認爲他希望計數爲0和1做最初分開的SQL。 –

0

你在查詢其中的根本原因是使用AND條款。改爲使用OR,因爲您希望條件中的任一個滿足而不是同時滿足。該聲明應爲((SiteProduct.ProductDisplay = 0) OR (SiteProduct_1.ProductDisplay = 1)),因爲該值可以同時爲0 or 1not 0 and 1

所以查詢變爲:

SELECT  SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1, COUNT(SiteProduct_1.SiteProductID) AS Expr2 
FROM   SiteProductVariation INNER JOIN 
         SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID INNER JOIN 
         SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID 
WHERE  (SiteProductVariation.ProductVariationID = 159868) AND ((SiteProduct.ProductDisplay = 0) OR (SiteProduct_1.ProductDisplay = 1)) 
GROUP BY SiteProductVariation.ProductVariationID 
0

你可以使用UNION子句嘗試。

SELECT SiteProductVariation.ProductVariationID, 
COUNT(SiteProduct.SiteProductID) AS Expr1 
FROM SiteProductVariation 
INNER JOIN SiteProduct 
ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE (SiteProductVariation.ProductVariationID = 159868) 
AND (SiteProduct.ProductDisplay = 0) 
GROUP BY SiteProductVariation.ProductVariationID 
UNION 
SELECT SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1 
FROM SiteProductVariation INNER JOIN 
SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE  (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 1) 
GROUP BY SiteProductVariation.ProductVariationID 
0

您可以使用UNION包含兩個查詢的結果。

如果你只想返回不同的(即非重複的)行,那麼就自己使用UNION。如果您需要兩個查詢中的所有行,請改爲使用UNION ALL

SELECT  SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1 
FROM   SiteProductVariation INNER JOIN 
         SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE  (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 1) 
GROUP BY SiteProductVariation.ProductVariationID 
UNION --Note you could use UNION ALL here if you want all rows returning 
SELECT  SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1, COUNT(SiteProduct_1.SiteProductID) AS Expr2 
FROM   SiteProductVariation INNER JOIN 
         SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID INNER JOIN 
         SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID 
WHERE  (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 0) AND (SiteProduct_1.ProductDisplay = 1) 
GROUP BY SiteProductVariation.ProductVariationID 
+0

聯盟不是一個解決方案恕我直言。如果發佈者希望每個SiteProductVariation.ProductVariationID, –

1

你可以這樣說:

SELECT  SiteProductVariation.ProductVariationID, 
SUM(CASE WHEN SiteProduct.ProductDisplay = 0 THEN 1 ELSE 0 END) AS Expr1, 
SUM(CASE WHEN SiteProduct.ProductDisplay = 1 THEN 1 ELSE 0 END) AS Expr2 
FROM   SiteProductVariation INNER JOIN 
         SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE  (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay IN (0,1)) 
GROUP BY SiteProductVariation.ProductVariationID