【问题标题】:SQL Server 2012 Query - Group by [duplicate]SQL Server 2012 查询 - 按 [重复] 分组
【发布时间】:2014-10-29 23:06:33
【问题描述】:

我有这个脚本

select  * 
from psPatDiscounts 
where cancelflag = '0' 
and refdate between  '2014-01-01 14:03:00' 
and '2014-01-31 14:03:00'
group by FK_psPatRegisters

然而,在运行这个脚本后,它给了我这个错误信息:

消息 8120,第 16 级,状态 1,第 1 行
列 'psPatDiscounts.PK_TRXNO' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

【问题讨论】:

  • 对于表中的所有可用列,SELECT * 扩展为 SELECT Col1, Col2, ...。错误消息告诉您,如果您 GROUP BY FK_psPatRegisters 您不能在查询的 SELECT 部分中包含任何其他列,除非它们被包裹在 aggregate function

标签: sql sql-server-2012


【解决方案1】:

要进行分组,您需要一个选择列和一个聚合函数,如下所示:

select  psPatRegisters.ID, Count(*) 
  from psPatDiscounts 
 where cancelflag = '0' 
   and refdate between  '2014-01-01 14:03:00' 
   and '2014-01-31 14:03:00'  group by psPatRegisters.ID

在这种情况下 Count(*) 是聚合函数,它按 ID 分组

【讨论】:

    【解决方案2】:

    您只能在GROUP BY 或聚合函数中包含引用的选择列,如您的错误所示。

    您要么需要在 GROUP BY 中包含更多列,要么将 SELECT * 减少到 SELECT FK_psPatRegisters

    SELECT FK_psPatRegisters
    FROM psPatDiscounts 
    WHERE cancelflag = '0' AND refdate BETWEEN '2014-01-01 14:03:00' AND '2014-01-31 14:03:00'
    GROUP BY FK_psPatRegisters
    

    本质上,问题在于单个单元格不能包含多个值。因此,要仅按一列分组并选择其他列,您需要指定如何处理这些多个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多