如何为结果分配正确的ROW_NUMBER

时间:2016-07-08 11:32:05

标签: sql sql-server

我有这个SQL:

SELECT 
    --CASE WHEN EA.[EntityAttentionTypeId] IS NULL THEN 1000+(ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] )) ELSE ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] ) END AS C_NO,
    ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId]) AS C_NO,
    EA.[EntityAttentionTypeId],
    C.PreName AS C_TITLE,
    C.FirstName AS C_NAME,
    C.LastName AS C_SURNAME,
    C.Email AS C_EMAIL,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'MAIN CONTACT' ELSE '' END AS C_COMMENTS,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_INV,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_UPDATES,
    CASE WHEN EA.[EntityAttentionTypeId] = 1 THEN 'v' ELSE ' ' END AS C_DOWN
FROM
    [CMSTIME].[dbo].[Contacts] C 
LEFT OUTER JOIN 
    [CMSTIME].[dbo].[Entities] E ON E.EntityId = C.EntityId 
FULL OUTER JOIN 
    [CMSTIME].[dbo].[EntityAttentions] EA ON EA.[PeopleId]= C.[ContactId]
WHERE 
    C.ContactId  IN (SELECT Entity2People.EmployeeId 
                     FROM Entity2People 
                     WHERE Entity2People.EntityId =  307)
ORDER BY 
    C_NO

我得到了这个结果:

enter image description here

如何更改我的SQL,以便在底部获取带有空EntityAttentionTypeId的行,而C_NO仍然可以读取1,2,3,4 ...等等

我已经尝试了

CASE WHEN EA.[EntityAttentionTypeId] IS NULL THEN 1000+(ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] )) ELSE ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId] ) END AS C_NO,

但我得到的结论是:

enter image description here

提前谢谢大家

2 个答案:

答案 0 :(得分:2)

我认为您需要ORDER BY -EntityAttentionTypeId DESC函数

中的ROW_NUMBER()

由于ASC会将NULL放在第一位,然后按非空值排序,如果按DESC排序则会将NULL放在最后。这当然会反转非Null值所需的顺序,因此如果您使用-运算符,您将返回正确的顺序,同时仍然保留NULL

e.g。

SELECT  ROW_NUMBER() OVER (ORDER BY -EntityAttentionTypeId DESC)  AS C_NO,
        EntityAttentionTypeId
FROM    (VALUES (NULL), (1), (2), (3)) t (EntityAttentionTypeId)
ORDER BY C_NO;

给出:

C_NO    EntityAttentionTypeId
-----------------------------
1       1
2       2
3       3
4       NULL

答案 1 :(得分:0)

嗯,我认为此结果查询应使用C_NOROW_NUMBER()重新定义CASE

SELECT (ROW_NUMBER() OVER (ORDER BY EA.[EntityAttentionTypeId]) +
        (CASE WHEN EA.EntityAttentionTypeId] IS NULL THEN 1000 ELSE 0 END)
       ) AS C_NO,
. . .
ORDER BY C_NO;