Sql 如何为结果指定正确的行号
我有一个SQL:Sql 如何为结果指定正确的行号,sql,sql-server,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.[En
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,使我得到底部为Null 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,
但我得到的是:
提前谢谢大家我想您需要在
行号()函数中使用ORDER BY-EntityAttentionTypeId DESC
由于ASC
将首先放置NULL
,然后按非NULL值排序,如果您按DESC
排序,它将最后放置NULL
。这当然会颠倒非空值的要求顺序,因此如果使用-
运算符,您可以返回到正确的顺序,同时在末尾保持Null
e、 g
给出:
C_NO EntityAttentionTypeId
-----------------------------
1 1
2 2
3 3
4 NULL
我想您需要在ROW\u NUMBER()函数中使用ORDER BY-EntityAttentionTypeId DESC
由于ASC
将首先放置NULL
,然后按非NULL值排序,如果您按DESC
排序,它将最后放置NULL
。这当然会颠倒非空值的要求顺序,因此如果使用-
运算符,您可以返回到正确的顺序,同时在末尾保持Null
e、 g
给出:
C_NO EntityAttentionTypeId
-----------------------------
1 1
2 2
3 3
4 NULL
嗯,我认为这个结果查询应该使用行数()和大小写来重新定义C\u NO
:
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;
嗯,我认为这个结果查询应该使用行数()和大小写来重新定义C\u NO
:
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;
你可以像C_NO那样做ROW_NUMBER()(ORDER BY ISNULL(EA.[EntityAttentionTypeId],[very large NUMBER here]),我想你可以像C_NO那样做ROW_NUMBER()(ORDER BY ISNULL(EA.[EntityAttentionTypeId],[very large NUMBER here]),我想是的,这个更新看起来不错。请注意,您可以将最后的顺序再次简化为C_NO
。这是另一个好的地方。我已根据您的建议更改了订单。实际上,使用任何建议的解决方案-您不再需要行号
。这是不必要的工作量。除非你出于某种原因需要新的号码来代替EntityAttentionTypeId。是的,这个更新看起来不错。请注意,您可以将最后的顺序再次简化为C_NO
。这是另一个好的地方。我已根据您的建议更改了订单。实际上,使用任何建议的解决方案-您不再需要行号
。这是不必要的工作量。除非出于某种原因,您需要新的号码来代替EntityAttentionTypeId。