具有选定列的 SQL DW 计数 (*) 不会聚合



这很奇怪,我在许多数据库上都进行过这种查询,但在这里我被难住了。我知道我的Synapse表有重复的

SELECT nmiandnmisuffixkey, ReadingDate, IntervalNumber
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12 

产生

+--------------------+-------------+----------------+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber |
+--------------------+-------------+----------------+
| XXXXXXXXXX         | 2020-10-08  |             12 |
| XXXXXXXXXX         | 2020-10-08  |             12 |
+--------------------+-------------+----------------+

但是当我试着跟随运行时

SELECT nmiandnmisuffixkey, ReadingDate, IntervalNumber, count(*) as cnt
FROM [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX'
and readingdate = '2020-10-08'
and IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber

我得到以下信息:-

+--------------------+-------------+----------------+-----+
| nmiandnmisuffixkey | ReadingDate | IntervalNumber | cnt |
+--------------------+-------------+----------------+-----+
| XXXXXXXXXX         | 2020-10-08  |             12 |   1 |
| XXXXXXXXXX         | 2020-10-08  |             12 |   1 |
+--------------------+-------------+----------------+-----+

为什么总数没有加起来?

一些可能性-

  1. 日期具有不同的时间/毫秒。所以,您可以尝试删除时间部分,然后再次按查询运行组
  2. 字符串列(键(的末尾或开头可以有空格。您可以使用ltrim/rtrim并再次通过查询运行group。客户端工具会将它们显示为与您的输出相同的数据。通过修剪空间,可以进行真正的比较

在OP的情况下,是情况#2。使用ltrim/rtrim解决了agg问题。

这是您的查询:

select nmiandnmisuffixkey, ReadingDate, IntervalNumber, count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
readingdate = '2020-10-08' and
IntervalNumber = 12
group by nmiandnmisuffixkey, ReadingDate, IntervalNumber

查询对group by中使用的每一列的特定值进行筛选。然而,当对它们进行聚合时,您会得到多行。

所以,你的问题是:;当相等比较与"相等"的概念不匹配时;平等;用于聚合">

我确信这不是一份全面的清单。

一种可能性是IntervalNumber实际上是一个字符串。=将这些值转换为数字,因此'012''12'在相等方面是相同的,但在聚合方面则不同。(这里是一个例子。(

换句话说,类型转换可能会导致这种差异。

这可能发生在字符串和排序规则中。通常,我预计会出现排序规则冲突错误。但是,您可以检查字符串列是否具有不同于数据库默认值(将用于字符串常量(的显式排序规则。

我不认为你的约会比较有同等的差异。

我还应该注意这个用例的一个变通方法:

select max(nmiandnmisuffixkey), max(ReadingDate), max(IntervalNumber), count(*) as cnt
from [dbo].[factMeterDataDetail]
where nmiandnmisuffixkey = 'XXXXXXXXXX' and
readingdate = '2020-10-08' and
IntervalNumber = 12;

也就是说,只需使用不带group by的聚合查询。保证返回一行。

您的表肯定有一个ID。当您计算(*(时,它包括ID。首先,将所需字段放入临时表中,然后按进行分组。

这样:

SELECT
nmiandnmisuffixkey, ReadingDate, IntervalNumber
Into
#tmp FROM [dbo].[factMeterDataDetail]
where
nmiandnmisuffixkey = 'XXXXXXXXXX' and readingdate = '2020-10-08' and IntervalNumber = 12
Select
nmiandnmisuffixkey, ReadingDate, IntervalNumber,count (*)as cnt
from
#tmp 
Group by
nmiandnmisuffixkey, ReadingDate, IntervalNumber

最新更新