我正在使用Sql-Server 2008。 我有一个表(MyTable),其中包含两列: IDCustomer 和 PhoneNumber 。一些IDCustomer没有PhoneNumber,即相应的PhoneNumber条目为空(PhoneNumber是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
因为我知道我将使用group by查询来获取它。 但我得到了:
PhoneNumber RN
1
2
112 1
118 1
911 1
所以看起来空白行是分开的并且逐步计算。我检查过两个以上的空白条目也是如此。对于istance,如果我有10个空白的PhoneNumbers,则第一个查询的结果是:第一列中有10个空白条目,第二列中RN从1增加到10个。
因此,我想问你是否知道为什么结果不是我期待的结果。我没有得到预期的结果,因为我错过了什么或犯了什么错误?
提前谢谢。
答案 0 :(得分:1)
试试这可能会对你有所帮助
;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
答案 1 :(得分:0)
如果您需要坚持分区而不是GROUP BY,那么您需要将ROW_NUMBER更改为COUNT(IDCUSTOMER)OVER(按电话号码分区)
答案 2 :(得分:0)
如他所说,他评论......
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