Reputation: 11377
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. ?
I tried adding "COUNT(*) AS volume
" but then I get an error that some column references are invalid.
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.
Upvotes: 0
Views: 261
Reputation: 1269623
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')
Upvotes: 1