空白条目分别计入"分区中的"条款

时间:2017-06-30 15:01:58

标签: sql-server sql-server-2008

我正在使用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个。

因此,我想问你是否知道为什么结果不是我期待的结果。我没有得到预期的结果,因为我错过了什么或犯了什么错误?

提前谢谢。

3 个答案:

答案 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