Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用相反的where条件在一个查询中进行两次计数_Sql_Sql Server_Count_Group By - Fatal编程技术网

Sql 使用相反的where条件在一个查询中进行两次计数

Sql 使用相反的where条件在一个查询中进行两次计数,sql,sql-server,count,group-by,Sql,Sql Server,Count,Group By,我有两个单独的查询,它们本身可以很好地工作,但我需要它们在一个查询中工作。我可以很容易地在excel中组合结果,但这将是更大查询的一部分 这两个独立的查询是: SELECT SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1 FROM SiteProductVariation INNER JOIN SiteProduct ON SitePro

我有两个单独的查询,它们本身可以很好地工作,但我需要它们在一个查询中工作。我可以很容易地在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

对于这个
ProductVariationID
有11个SiteProductID,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
没有结果。我想这是因为我查这个问题时使用了GROUPBY


即使说我不能这样做,任何帮助都是感激的。siteproductid可能有0个结果,ProductDisplay等于1或0,因此可能需要加以考虑。提前感谢。

在中修改第一个版本以使用
。另外,使用表别名简化查询:

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;
请注意:您的版本将在
产品显示
上的两个条件之间使用
,而不是

如果希望结果与
ProductDisplay
值分开,则将其包括在
选择和
分组依据中:

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;

您在查询中使用了
子句,这是根本原因。改用
,因为您希望其中一个条件满足,而不是同时满足。语句应该是
((SiteProduct.ProductDisplay=0)或(SiteProduct_1.ProductDisplay=1))
,因为值可以是
0或1
而不是0和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  

你可以试试工会条款

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

您可以使用
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

您可以这样做:

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

联合不是解决办法。如果海报希望每个SiteProductVariation.ProductVariationID获得2行,那么将SiteProduct_1.ProductDisplay添加到SQL本身将不是一个联合,而是一个更简单的解决方案,这将返回SiteProduct.ProductDisplay中的总计数为0或1。我认为他希望在开始时将0和1的计数分开进行SQLs。除了已经给出的答案之外:通过使用两个内部联接,您只能得到同时具有ProductDisplay=0的SiteProduct记录和ProductDisplay=1的SiteProductVariations。您可以改为使用左外部联接,将ProductDisplay条件移动到ON子句并计算不同的ID,但最好只查询一次表,如Cetin Basoz所示(只有给出的解释不准确)。“给出的解释不准确”???你认为像这样简单的SQL需要任何解释吗?@Cetin Basoz:对不起,无意冒犯的意思是:-)“值不能同时为0和1”是错误的。很可能一个SiteProductVariation存在两个SiteProduct记录,一个为ProductDisplay 0,另一个为1。因此,您并没有真正解释OP的查询有什么问题。但你的解决方案很好。哦,你是对的,我没有注意到他将它们分别命名为SiteProduct和SiteProduct_1。你的解决方案很好,只是它指的是不存在的SiteProduct_1别名。我也被同样的错误观念所困扰:)这将只是SIteProduct.ProductDisplay谢谢,这非常有效。我删除了和(SiteProduct.ProductDisplay=0或SiteProduct_1.ProductDisplay=1),因为0和1是它只能处于的两种状态。我将它应用到一个更大的查询中,这是其中的一部分,在添加了DISTINCT before CASE之后,由于它的连接方式,它也起了作用。@Georgie很高兴它帮助了您:)
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
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