【问题标题】:SQL group by clause error Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=,SQL group by 子句错误子查询返回超过 1 个值。当子查询跟在 =、!=、
【发布时间】:2013-03-12 22:38:36
【问题描述】:

我有一个查询,它按组计算活跃客户,并且必须按组计算取货量。

SELECT  [Category] = ISNULL(c.Category, 'Total'),
        COUNT (hs.ClientID) as '3 Mo Clients',
        (COUNT (hs.ClientID))/3 as MoAVG
      ,(select COUNT(PickupID)from Pickup where PickupDate between '2013-01-01' and '2013-03-30' group by CategCode) as '3 Mo Picups'

FROM    Category c 
        LEFT JOIN history hs
            ON hs.CategCode = c.CategCode 
            where ReccordDate between '2013-01-01' and '2013-03-30'
GROUP BY Category
WITH ROLLUP

此查询抛出错误:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

如果我没有在 4 行中使用 group by,它可以工作,但不会按组划分拾音器。 这是代码的 4 行中没有 group by 子句的示例如何工作

任何想法如何解决它?

【问题讨论】:

  • 傻评:3月有31天。
  • @ypercube 现在不重要,它会从用户那里获取数据。是的CategCode 在取货中
  • 你为什么不加入皮卡而不是使用子查询?

标签: sql sql-server-2008 group-by


【解决方案1】:

尝试添加这个条件:CategCode = c.CategCode

SELECT [Category] = ISNULL(c.Category, 'Total'),
       COUNT (hs.ClientID) as [3 Mo Clients],
       (COUNT (hs.ClientID))/3 as MoAVG
      ,(SELECT COUNT(PickupID) 
        FROM Pickup 
        WHERE PickupDate between '2013-01-01' and '2013-03-30'
          AND  CategCode = c.CategCode
       ) AS [3 Mo Picups]
FROM Category c LEFT JOIN history hs ON hs.CategCode = c.CategCode 
WHERE ReccordDate between '2013-01-01' and '2013-03-30'
GROUP BY c.CategCode, c.Category 
WITH ROLLUP

SELECT [Category] = ISNULL(c.Category, 'Total'),
       COUNT (hs.ClientID) as [3 Mo Clients],
       (COUNT (hs.ClientID))/3 as MoAVG,
       SUM(o.cnt) AS [3 Mo Picups]
FROM Category c LEFT JOIN history hs ON hs.CategCode = c.CategCode
                CROSS APPLY (
                             SELECT COUNT(PickupID) AS cnt
                             FROM Pickup 
                             WHERE PickupDate between '2013-01-01' and '2013-03-30'
                               AND  CategCode = c.CategCode
                             ) o
WHERE ReccordDate between '2013-01-01' and '2013-03-30'
GROUP BY c.Category 
WITH ROLLUP

【讨论】:

  • 我试过这个wariant也给了我这个错误Msg 8120, Level 16, State 1, Line 7 Column 'Category.CategCode' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 图片第一列客户类别名称
  • 如果我使用WITH ROLLUP,它会在每一列下加上总数:(但它有效。
  • 第二个例子不要理解这一行o.cnt AS [3 Mo Picups],但没关系,我会先使用,只计算总数,不会使用WITH ROLLUP
  • 你知道吗WITH ROLLUP 在每个组中添加总行而不是在响应的末尾?
猜你喜欢
  • 2013-04-29
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多