SQL Server:在一个查询中选择并计数

时间:2013-11-30 15:15:36

标签: sql sql-server stored-procedures

我使用以下存储过程按类别对表中的项目进行分组,并为每个组添加计数和最大值

到目前为止,此工作正常。 我怎样才能实现,对于每个组我也会获得列出的包含项目? 当我只在这里选择一个列(例如itemID)时,我收到一个错误。

到目前为止我的存储过程:

      ALTER PROCEDURE [dbo].[FetchRequests]

      AS
      BEGIN
      SET NOCOUNT ON;
      SELECT              categoryX,
                          COUNT(*) AS groupCount,
                          MAX(dateX) AS groupNewest
      FROM                LogRequests
      WHERE               logStatus = 'active'
      GROUP BY            categoryX
      ORDER BY            groupCount desc, categoryX
      FOR XML PATH('categoryX'), ELEMENTS, TYPE, ROOT('ranks')
      END

我刚刚在上面添加“itemID”时收到的错误选择: 消息8120,级别16,状态1,过程FetchRequests, 列'LogRequests.itemID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

预期输出:

  • 第1类
    • groupCount
    • groupNewest
    • 所有具有category = 1
    • 的itemID的列表
  • 第2类
    • groupCount
    • groupNewest
    • 所有具有category = 2
    • 的itemID的列表
  • 第3类
    • groupCount
    • groupNewest
    • 所有具有category = 3
    • 的itemID的列表

感谢您对此提供任何帮助,Tim。

2 个答案:

答案 0 :(得分:2)

select子句中的任何非聚合字段必须出现在group by子句

答案 1 :(得分:1)

  ALTER PROCEDURE [dbo].[FetchRequests]

  AS
  BEGIN
  SET NOCOUNT ON;
  SELECT              itemid,categoryX,
                      COUNT(*) AS groupCount,
                      MAX(dateX) AS groupNewest
  FROM                LogRequests
  WHERE               logStatus = 'active'
  GROUP BY            itemid,categoryX
  ORDER BY            groupCount desc, categoryX
  FOR XML PATH('categoryX'), ELEMENTS, TYPE, ROOT('ranks')
  END

您需要将项目添加到group by子句。