一个查询中的两个计数反对标准

时间:2015-07-20 11:27:51

标签: sql sql-server count group-by

我有两个单独的查询可以自己正常工作,但我需要它们在一个查询中工作。我可以在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

并且没有结果。我认为这是因为当我看到这个问题时使用分组。

即使要说我不能这样做,任何帮助都是值得欣赏的。如果ProductDisplay等于1或0,则siteproductid可能会有0个结果,因此可能需要考虑这些结果。提前谢谢。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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;

答案 3 :(得分: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  

答案 4 :(得分: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

答案 5 :(得分: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