我有这个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
我得到了这个结果:
如何更改我的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,
但我得到的结论是:
提前谢谢大家
答案 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_NO
和ROW_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;