[英]SQL query using ROW_NUMBER() OVER PARTITION BY with Dynamic Columns
现实世界的问题:我有一个维护数据库及其所有者的数据库。 以下查询以我想要的格式生成我想要的结果,因此没有问题。
但是,目前返回的列是 static,我希望它们是动态的。
代码:
WITH dow AS
(
SELECT
dow.Database_ID
,d.DatabaseName
,d.[Server]
,o.Owner_FirstName + ' ' + o.Owner_LastName AS [User]
,dow.IsOwner
,ROW_NUMBER() OVER (PARTITION BY dow.Database_ID ORDER BY dow.IsOwner DESC) AS r
FROM
DatabaseOwner dow
LEFT JOIN
[Owner] o ON dow.Owner_ID = o.Owner_ID
LEFT JOIN
[Database] d ON dow.Database_ID = d.Database_ID
WHERE
d.DatabaseType_ID = 4
),
[rCount] AS
(
SELECT MAX(r) AS [Maxr]
FROM dow
)
SELECT
DatabaseName
,[Server]
,MAX(CASE r WHEN 1 THEN [User] ELSE '' END) AS [Owner]
,MAX(CASE r WHEN 2 THEN [User] ELSE '' END) AS [Alt Owner 1]
,MAX(CASE r WHEN 3 THEN [User] ELSE '' END) AS [Alt Owner 2]
,MAX(CASE r WHEN 4 THEN [User] ELSE '' END) AS [Alt Owner 3]
FROM
dow
GROUP BY
DatabaseName, [Server]
ORDER BY
DatabaseName, [Server]
结果:
DatabaseName Server Owner Alt Owner 1 Alt Owner 2 Alt Owner 3
db_CatsCradle cv_Vonnegut Kurt Vonnegut Joseph Heller Douglas Adams
db_Catch22 cv_Heller Joseph Heller Chuck Palahniuk Joseph Heller Douglas Adams
db_Hitchhikers cv_Adams Douglas Adams Kurt Vonnegut
db_InvisibleMonsters cv_Palahniuk Chuck Palahniuk Joseph Heller
那么我如何为 n 个 Alt 所有者动态编写这个? 最初,它被设置为将 Alt 所有者的数量限制为 3,但现在我需要扩展它以允许任意数量的 Alt 所有者。
谢谢。
感谢 Arron Bertrand 帮助我重新考虑策略,以下产生了预期的结果。
代码:
WITH [owns] AS (
SELECT dow.Database_ID
,CASE WHEN dow.IsOwner = 1 THEN o.Owner_FirstName + ' ' + o.Owner_LastName ELSE '' END AS [Owner]
FROM DatabaseOwner dow
LEFT JOIN [Owner] o ON dow.Owner_ID = o.Owner_ID
WHERE dow.IsOwner = 1
),
[funcs] AS (
SELECT dow.Database_ID
,CASE WHEN dow.IsOwner = 0 THEN SUBSTRING(
( SELECT '; ' + o.Owner_FirstName + ' ' + o.Owner_LastName
FROM DatabaseOwner dow1
LEFT JOIN [Owner] o ON dow1.Owner_ID = o.Owner_ID
WHERE dow1.Database_ID = dow.Database_ID
AND dow1.IsOwner = 0
ORDER BY dow1.Database_ID
FOR XML PATH('')
), 2, 1000) ELSE '' END AS [Owner]
FROM DatabaseOwner dow
LEFT JOIN [Owner] o ON dow.Owner_ID = o.Owner_ID
WHERE dow.IsOwner = 0
)
SELECT TOP 5 d.DatabaseName
,d.[Server]
,o.[Owner]
,f.[Owner] AS [Alt Owner]
FROM DatabaseOwner dow
LEFT JOIN [owns] o ON dow.Database_ID = o.Database_ID
LEFT JOIN [funcs] f ON dow.Database_ID = f.Database_ID
LEFT JOIN [Database] d ON dow.Database_ID = d.Database_ID
GROUP BY d.DatabaseName
,d.[Server]
,o.[Owner]
,f.[Owner]
ORDER BY DatabaseName
,[Server]
结果:
DatabaseName Server Owner Alt Owner
db_CatsCrade cv_Vonnegut Kurt Vonnegut Joseph Heller; Douglas Adams
db_Catch22 cv_Heller Joseph Heller Chuck Palahniuk; Joseph Heller; Douglas Adams
db_Hitchhikers cv_Adams Douglas Adams Kurt Vonnegut
db_InvisibleMonsters cv_Palahniuk Chuck Palahniuk Joseph Heller
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.