繁体   English   中英

SQL 查询使用动态列的 ROW_NUMBER() OVER PARTITION BY

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM