我正在使用Sql-Server 2008。 我有一个表(MyTable(,其中包含两列:IDCustomer和PhoneNumber。一些 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