在"partition by"子句中单独计数的空白条目



我正在使用Sql-Server 2008。 我有一个表(MyTable(,其中包含两列:IDCustomerPhoneNumber。一些 IDCustomers 没有电话号码,即相应的电话号码条目为空(电话号码是一个 varchar 变量(。

在这里,我给出了我的表格的第一个条目:

IDCUstomer    PhoneNumber
22               
13            911
10            118
8
17            112
....          ....

我正在使用此语句评估每个不同的电话号码出现的次数:

select 
PhoneNumer,
RN = ROW_NUMBER() OVER (PARTITION BY PhoneNumber ORDER BY PhoneNumber ASC)
FROM MyTable

我故意不使用

select PhoneNumber, 
count(PhoneNumber)
from MyTable
group by PhoneNumber

因为为了达到我的最终结果(这不是问题的主题(,我需要使用前一个表达式。

我的问题是使用前一个表达式(分区依据的表达式(获得的结果。事实上,我期待这个结果:

PhoneNumber     RN
                2  
112             1
118             1
911             1

因为我知道我会使用带有组依据的查询来获取它。 但相反,我得到:

PhoneNumber     RN
                1
                2    
112             1
118             1
911             1 

因此,看起来空白行是单独并逐步计数的。我已经检查了两个以上的空白条目是否会发生同样的情况。首先,如果我有十个空白电话号码,则第一个查询的结果是:第一列中有十个空白条目,第二列中的 RN 从 1 增加到 10。

因此,我想问你是否知道为什么结果不是我所期望的。我是否因为遗漏了某些内容或犯了任何错误而没有获得预期的结果?

提前谢谢你。

试试这个可能会对你有所帮助

;WITH cte(IDCUstomer,PhoneNumber)
AS
(
SELECT 22,  NULL  UNION ALL
SELECT 13,  911   UNION ALL
SELECT 10,  118   UNION ALL
SELECT 8,   NULL  UNION ALL
SELECT 17,  112
)
SELECT ISNULL(CAST(PhoneNumber AS VARCHAR(10)), '') AS PhoneNumber
    ,RN
FROM (
    SELECT PhoneNumber
        ,RN = ROW_NUMBER() OVER (
            PARTITION BY PhoneNumber ORDER BY IDCUstomer DESC
            )
        ,ROW_NUMBER() OVER (
            ORDER BY (
                    SELECT NULL
                    )
            ) - 1 AS Seq
    FROM cte
    ) DT
WHERE dt.Seq > 0

结果

PhoneNumber     RN
                2  
112             1
118             1
911             1

如果您需要坚持使用分区而不是 GROUP BY,那么您需要将ROW_NUMBER更改为 COUNT(IDCUSTOMER( OVER (按电话号码分区(

正如评论中所解释的...

declare @table table (IDCUstomer int, Phonenumber varchar(8))
insert into @table
values
(1,' '),
(2,'     '),
(3,'123'),
(4,'456')
select 
    Phonenumber,
    ROW_NUMBER() over (partition by Phonenumber order by Phonenumber) as RN
from @table
group by Phonenumber

如果数据中有NULL值,则可以使用它

declare @table table (IDCUstomer int, Phonenumber varchar(8))
insert into @table
values
(1,' '),
(2,'     '),
(3,'123'),
(4,'456'),
(5,NULL)

select 
    Phonenumber,
    ROW_NUMBER() over (partition by Phonenumber order by Phonenumber) as RN
from 
    (select isnull(Phonenumber,'') as Phonenumber from @table) x
group by Phonenumber

最新更新