简体   繁体   English

SQL Server:如何将计数添加到嵌套的选择查询

[英]SQL Server: How to add Count to nested Select query

I have a stored procedure that fetches data from three separate tables using the following query which works as intended. 我有一个存储过程,可以使用下面的查询按预期方式从三个单独的表中获取数据。

How can I add a Count to each level so that I know how many items there are selected for A., B. and C. ? 如何为每个级别添加一个计数,以使我知道为A,B和C选择了多少个项目? I tried adding " COUNT(*) AS volume " but then I get an error that some column references are invalid. 我尝试添加“ COUNT(*) AS volume ”,但随后出现错误,指出某些列引用无效。

BEGIN
    SET NOCOUNT ON;
    SELECT      A.itemID,
                A.title,
                A.sortID,
                CONVERT(VARCHAR(11), A.modDate, 106) AS modDate,
                A.modBy,
                (
                    SELECT      B.itemID,
                                B.parentID,
                                B.title,
                                B.sortID,
                                CONVERT(VARCHAR(11), B.modDate, 106) AS modDate,
                                B.modBy,
                                (
                                    SELECT      C.itemID,
                                                C.parentID,
                                                C.title,
                                                C.sortID,
                                                CONVERT(VARCHAR(11), C.modDate, 106) AS modDate,
                                                C.modBy
                                    FROM        ORG_Nav3 C
                                    WHERE       C.parentID = B.itemID
                                    AND         C.logStatus = 'active'
                                    ORDER BY    C.sortID, C.title
                                    FOR XML PATH('nav3'), ELEMENTS, TYPE
                                )
                    FROM        ORG_Nav2 B
                    WHERE       B.parentID = A.itemID
                    AND         B.logStatus = 'active'
                    ORDER BY    B.sortID, B.title
                    FOR XML PATH('nav2'), ELEMENTS, TYPE
                )
    FROM        ORG_Nav1 A
    WHERE       A.logStatus = 'active'
    ORDER BY    A.sortID, A.title
    FOR XML PATH('nav'), ELEMENTS, TYPE, ROOT('ranks')

END

Many thanks for any help with this, Tim. 蒂姆,非常感谢您对此提供的任何帮助。

I think you can get what you want using window functions. 我认为您可以使用窗口函数获得想要的东西。 Note that the counts will be repeated for each element, though: 请注意,尽管如此,每个元素的计数都会重复:

SELECT      A.itemID,
            A.title,
            A.sortID,
            CONVERT(VARCHAR(11), A.modDate, 106) AS modDate,
            A.modBy,
            COUNT(*) OVER () as CNT
            (
                SELECT      B.itemID,
                            B.parentID,
                            B.title,
                            B.sortID,
                            CONVERT(VARCHAR(11), B.modDate, 106) AS modDate,
                            B.modBy,
                            COUNT(*) OVER () as CNT
                            (
                                SELECT      C.itemID,
                                            C.parentID,
                                            C.title,
                                            C.sortID,
                                            CONVERT(VARCHAR(11), C.modDate, 106) AS modDate,
                                            C.modBy,
                                            COUNT(*) OVER () as CNT
                                FROM        ORG_Nav3 C
                                WHERE       C.parentID = B.itemID
                                AND         C.logStatus = 'active'
                                ORDER BY    C.sortID, C.title
                                FOR XML PATH('nav3'), ELEMENTS, TYPE
                            )
                FROM        ORG_Nav2 B
                WHERE       B.parentID = A.itemID
                AND         B.logStatus = 'active'
                ORDER BY    B.sortID, B.title
                FOR XML PATH('nav2'), ELEMENTS, TYPE
            )
FROM        ORG_Nav1 A
WHERE       A.logStatus = 'active'
ORDER BY    A.sortID, A.title
FOR XML PATH('nav'), ELEMENTS, TYPE, ROOT('ranks')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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