【问题标题】:Cannot perform an aggregate function on an expression containing an aggregate or a subquery sql server 2012无法对包含聚合或子查询 sql server 2012 的表达式执行聚合函数
【发布时间】:2017-01-14 06:27:04
【问题描述】:

我正在执行查询并显示错误无法对包含聚合或子查询的表达式执行聚合函数。

查询是

 SELECT
 tbl_Product.ID,
 tbl_Product.ArticleID,
 tbl_Product.Title, 
 tbl_Product.Description,
 tbl_Product.Price,
 tbl_ProductType.Name,
 tbl_Status.StatusName,     
 tbl_VisibilityStatus.VisibilityStatus,
 MAX(
     CASE 
         WHEN tbl_RelatedProduct.TypeOfRelation = 1 THEN 'Bundle' 
         WHEN tbl_Product.ID IN 
        ( 
         select tbl_RelatedProduct.Product2ID 
         from tbl_RelatedProduct 
         where tbl_RelatedProduct.Product1ID=9 and tbl_RelatedProduct.TypeOfRelation=1)            THEN 'Bundle'
        END
        ) 'Bundle',
 MAX(
     CASE 
         WHEN tbl_RelatedProduct.TypeOfRelation = 2 THEN 'Follower' END) 'Follower',
 MAX(
     CASE 
         WHEN tbl_RelatedProduct.TypeOfRelation = 3 THEN 'Related' END) 'Related'
 FROM            
 tbl_Product inner JOIN
 tbl_ProductType ON tbl_Product.ProductTypeId = tbl_ProductType.ID Inner JOIN
 tbl_Status ON tbl_Product.StatusID = tbl_Status.ID Inner JOIN
 tbl_VisibilityStatus ON tbl_Product.VisibilityID = tbl_VisibilityStatus.ID
 left JOIN tbl_RelatedProduct ON tbl_Product.ID = tbl_RelatedProduct.Product1ID
 group by      
 tbl_Product.ID,
 tbl_Product.ArticleID,
 tbl_Product.Title,
 tbl_Product.Description,
 tbl_Product.Price,
 tbl_ProductType.Name,
 tbl_Status.StatusName, 
 tbl_VisibilityStatus.VisibilityStatus
 order by tbl_Product.Title

任何人都知道如何在这方面提供帮助......请

【问题讨论】:

  • 请记住,CASE 表达式从上到下评估条件,并在找到匹配项时停止。所以你的第一个CASE 中的第二个WHEN 只会在tbl_RelatedProduct.TypeOfRelation <> 1 时被击中,对吗?我现在看到子查询中有相同的条件,所以子查询永远不会产生任何行 IMO。
  • 此外,CASE 总是输出 'Bundle'(如果没有找到匹配项,则输出 NULL),那么为什么要使用 MAX

标签: sql sql-server sql-server-2012


【解决方案1】:

下面一行导致了一个问题:

WHEN tbl_Product.ID IN 
    ( 
     select tbl_RelatedProduct.Product2ID 
     from tbl_RelatedProduct 
     where tbl_RelatedProduct.Product1ID=9 and tbl_RelatedProduct.TypeOfRelation=1)            THEN 'Bundle'
    END
    ) 'Bundle',

您将MAXCASE 一起使用,而CASE 中的一个语句使用了导致错误的子查询。您可能需要考虑使用联接而不是子查询来实现这一点。

【讨论】:

    【解决方案2】:

    选择 tbl_Product.ID,tbl_Product.ArticleID,tbl_Product.Title,tbl_Product.Description,tbl_Product.Price,tbl_ProductType.Name,tbl_Status.StatusName, tbl_VisibilityStatus.VisibilityStatus, 当 ((select count(1) from tbl_RelatedProduct where tbl_RelatedProduct.TypeOfRelation = 1 and tbl_RelatedProduct.Product1ID = tbl_Product.Id) > 0) then 1 当 ((select count(1) from tbl_RelatedProduct where tbl_RelatedProduct.TypeOfRelation = 1 and tbl_RelatedProduct.Product2ID = tbl_Product.Id) > 0) then 1 else 0 以 Bundle 结尾, (从 tbl_RelatedProduct 中选择 count(1),其中 tbl_RelatedProduct.TypeOfRelation = 2 和 tbl_RelatedProduct.Product1ID = tbl_Product.Id)作为关注者, (从 tbl_RelatedProduct 中选择 count(1),其中 tbl_RelatedProduct.TypeOfRelation = 3 和 tbl_RelatedProduct.Product1ID = tbl_Product.Id)作为相关

    来自 tbl_Product 内部联接 tbl_ProductType ON tbl_Product.ProductTypeId = tbl_ProductType.ID 内部联接 tbl_Status ON tbl_Product.StatusID = tbl_Status.ID 内部联接 tbl_VisibilityStatus ON tbl_Product.VisibilityID = tbl_VisibilityStatus.ID

    通过这个查询解决了:)

    【讨论】:

      【解决方案3】:

      我想我明白你在做什么,这有点奇怪。我会将其全部输出为一列,并丢失 MAX 聚合,如下所示:

      SELECT 
          p.ID,
          p.ArticleID,
          p.Title,
          p.Description,
          p.Price,
          pt.Name,
          s.StatusName,
          v.VisibilityStatus,
          CASE
              WHEN rp.TypeOfRelation = 1 OR (rp2.Product1ID = 9 AND rp2.TypeOfRelation = 1)
                  THEN 'Bundle'
              WHEN rp.TypeOfRelation = 2
                  THEN 'Follower'
              WHEN rp.TypeOfRelation = 3
                  THEN 'Related'
              ELSE Null
          END AS Relation
      FROM 
           tbl_Product p
           INNER JOIN tbl_ProductType pt
               ON p.ProductTypeId = pt.ID
           INNER JOIN tbl_Status s
               ON p.StatusID = s.ID
           INNER JOIN tbl_VisibilityStatus v
               ON p.VisibilityID = v.ID
           LEFT JOIN tbl_RelatedProduct rp
               ON p.ID = rp.Product1ID
           LEFT JOIN tbl_RelatedProduct rp2
               ON p.ID = rp2.Product2ID
      ORDER BY p.Title
      

      如果您仍希望将它们放在单独的列中,只需将 CASE 语句分解如下:

      SELECT 
          p.ID,
          p.ArticleID,
          p.Title,
          p.Description,
          p.Price,
          pt.Name,
          s.StatusName,
          v.VisibilityStatus,
          CASE
              WHEN rp.TypeOfRelation = 1 OR (rp2.Product1ID = 9 AND rp2.TypeOfRelation = 1)
                  THEN 'Bundle'
              ELSE Null
          END AS Bundle,
          CASE
              WHEN rp.TypeOfRelation = 2
                  THEN 'Follower'
              ELSE Null
          END AS Follower,
          CASE
              WHEN rp.TypeOfRelation = 3
                  THEN 'Related'
              ELSE Null
          END AS Related
      FROM 
           tbl_Product p
           INNER JOIN tbl_ProductType pt
               ON p.ProductTypeId = pt.ID
           INNER JOIN tbl_Status s
               ON p.StatusID = s.ID
           INNER JOIN tbl_VisibilityStatus v
               ON p.VisibilityID = v.ID
           LEFT JOIN tbl_RelatedProduct rp
               ON p.ID = rp.Product1ID
           LEFT JOIN tbl_RelatedProduct rp2
               ON p.ID = rp2.Product2ID
      ORDER BY p.Title
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        相关资源
        最近更新 更多