2015-07-20 61 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