Reputation: 867
I've got a query in which I am trying to allow sorting based on a parameter passed in by a C# SQL Server client library. My query currently looks like this ...
SELECT d.OpinionDocumentId,
d.DisplayTitle,
d.Court,
d.State,
d.Date,
(SELECT i.Identifier + ', '
FROM dbo.OpinionDocumentCitationIdentifiers i
WHERE i.OpinionDocument_OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
FOR XML PATH('')) AS Identifiers,
COUNT(DISTINCT c.OpinionDocument_OpinionDocumentId1) AS CitationCount,
COUNT(DISTINCT t.OpinionDocument_OpinionDocumentId) AS CitedByCount
FROM dbo.OpinionDocumentBookmarks b
INNER JOIN dbo.OpinionDocuments d ON d.OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
LEFT JOIN dbo.OpinionDocumentOpinionDocuments c ON c.OpinionDocument_OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
LEFT JOIN dbo.OpinionDocumentOpinionDocuments t ON t.OpinionDocument_OpinionDocumentId1 = b.OpinionDocument_OpinionDocumentId
WHERE b.Account_AccountId = @accountId
GROUP BY b.OpinionDocumentBookmarkId,
b.OpinionDocument_OpinionDocumentId,
d.OpinionDocumentId,
d.DisplayTitle,
d.Court,
d.State,
d.Date
ORDER BY CASE WHEN @sort = 'DisplayTitle' THEN d.DisplayTitle END,
CASE WHEN @sort = 'Date' THEN d.Date END,
CASE WHEN @sort = 'Court' THEN d.Court END,
CASE WHEN @sort = 'State' THEN d.State END,
CASE WHEN @sort = 'Citations' THEN CitationCount END
OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY
As you can see, I'm trying to allow sorting based on a parameter. I'm trying to allow sorting on the aggregated CitationCount
or CitedByCount
columns. I can sort by these columns when I do not use the ORDER BY CASE WHEN
, but when I try to specify that as a column in the ORDER BY CASE WHEN
I get an error saying that it's not a column.
Is this possible?
Upvotes: 0
Views: 105
Reputation: 36
SELECT *
FROM
(
SELECT
d.OpinionDocumentId
, d.DisplayTitle
, d.Court
, d.[State]
, d.[Date]
, (
SELECT i.Identifier + ', '
FROM dbo.OpinionDocumentCitationIdentifiers AS i
WHERE i.OpinionDocument_OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
FOR XML PATH('')
) AS Identifiers
, COUNT(DISTINCT c.OpinionDocument_OpinionDocumentId1) AS CitationCount
, COUNT(DISTINCT t.OpinionDocument_OpinionDocumentId) AS CitedByCount
FROM
dbo.OpinionDocumentBookmarks AS b
INNER JOIN dbo.OpinionDocuments AS d
ON d.OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
LEFT JOIN dbo.OpinionDocumentOpinionDocuments AS c
ON c.OpinionDocument_OpinionDocumentId = b.OpinionDocument_OpinionDocumentId
LEFT JOIN dbo.OpinionDocumentOpinionDocuments AS t
ON t.OpinionDocument_OpinionDocumentId1 = b.OpinionDocument_OpinionDocumentId
WHERE b.Account_AccountId = @accountId
GROUP BY
b.OpinionDocumentBookmarkId
, b.OpinionDocument_OpinionDocumentId
, d.OpinionDocumentId
, d.DisplayTitle
, d.Court
, d.State
, d.Dat
) AS H
ORDER BY
CASE WHEN @sort = 'DisplayTitle' THEN DisplayTitle END,
CASE WHEN @sort = 'Date' THEN [Date] END,
CASE WHEN @sort = 'Court' THEN Court END,
CASE WHEN @sort = 'State' THEN [State] END,
CASE WHEN @sort = 'Citations' THEN CitationCount END
Upvotes: 2