SQL Server 2012 查询 - 按 [重复] 分组

Posted

技术标签:

【中文标题】SQL Server 2012 查询 - 按 [重复] 分组【英文标题】:SQL Server 2012 Query - Group by [duplicate] 【发布时间】: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 【参考方案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

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

【讨论】:

以上是关于SQL Server 2012 查询 - 按 [重复] 分组的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver分页去重失效

使用 SQL Server 将子查询结果重用于其他计算

SQL Server:按字符串连接分组

sqlserver语句问题

使用 Visual Studio 2012 和 SQL Server Management Studio 2012 运行 SQL Server CE 4 查询

sql server 按时间段查询