【问题标题】:SQL Order By Custom CASE WHEN ordering [duplicate]SQL Order By Custom CASE WHEN ordering [重复]
【发布时间】:2016-08-16 18:28:53
【问题描述】:

我正在尝试自定义 ORDER BY 子句,以便“其他公司”始终排在最后。我不确定这里有什么问题。这是我所有的代码。 WHERE 子句可能看起来是多余的,但这是因为参数被替换为宏代码,其中此 SQL 字符串被上传以根据日期和状态以不同方式填充。别担心。我之前在另一种情况下这样做过,我订购了所有东西,但没有使用两个不同的列。输出显示 ORDER BY 子句中的“AmountOfClaims”不是有效列。有人可以帮我吗?

SELECT 
    CASE 
       WHEN co.[CompanyName] != '' 
          THEN co.CompanyName 
          ELSE 'Unspecified Companies' 
    END AS CompanyName, 
    COUNT(co.[CompanyName]) AS [AmountOfClaims]
FROM
    (SELECT 
         CASE 
            WHEN [Claims].[CompanyName] IN (SELECT TOP 10 [Claims].[CompanyName]
                                            FROM [Claims]
                                            WHERE Claims.[HousingRequested] >= '2016-08-02'
                                              AND Claims.[HousingRequested] <= '2016-08-16'
                                              AND (Claims.[State] = NULL OR Claims.[State] >= CASE WHEN NULL IS NULL THEN ' ' ELSE 'ZZZZ' END)
                                            GROUP BY [Claims].[CompanyName]
                                            ORDER BY COUNT([Claims].[CompanyName]) DESC)
               THEN [Claims].[CompanyName] 
               ELSE 'Other Companies' 
         END AS [CompanyName]
     FROM 
         [Claims] 
     WHERE 
         Claims.[HousingRequested] >= '2016-08-02'
         AND Claims.[HousingRequested] <= '2016-08-16'
         AND (Claims.[State] = NULL OR Claims.[State] >= CASE WHEN NULL IS NULL THEN ' ' ELSE 'ZZZZ' END)
    ) AS co
GROUP BY 
    co.[CompanyName]
ORDER BY 
    CASE 
       WHEN [CompanyName] = 'Other Companies' 
          THEN 9999 
          ELSE [AmountOfClaims] 
    END DESC

【问题讨论】:

  • 根本不是重复的问题。
  • 正是你的问题。您尝试使用[AmountOfClaims] 而不是COUNT(co.[CompanyName]) 那是calculated column 但不是WHERE 您尝试在ORDER BY 上使用它

标签: sql sql-server database sql-order-by case-when


【解决方案1】:

您可以将当前查询用作派生表或 CTE,或者只使用 ORDER BY 中的 COUNT

SELECT 
    CASE WHEN co.[CompanyName] != '' THEN co.CompanyName ELSE 'Unspecified Companies' END AS CompanyName, 
    COUNT(co.[CompanyName]) AS [AmountOfClaims]
FROM
    ( SELECT CASE WHEN [Claims].[CompanyName] IN

            ( SELECT TOP 10 [Claims].[CompanyName]
            FROM [Claims]
                WHERE Claims.[HousingRequested] >= '2016-08-02'
                AND Claims.[HousingRequested] <= '2016-08-16'
                AND (Claims.[State] = NULL OR Claims.[State] >= CASE WHEN NULL IS NULL THEN ' ' ELSE 'ZZZZ' END)

            GROUP BY [Claims].[CompanyName]
            ORDER BY COUNT([Claims].[CompanyName]) DESC )

        THEN [Claims].[CompanyName] ELSE 'Other Companies' END AS [CompanyName]

    FROM [Claims] 
        WHERE Claims.[HousingRequested] >= '2016-08-02'
        AND Claims.[HousingRequested] <= '2016-08-16'
        AND (Claims.[State] = NULL OR Claims.[State] >= CASE WHEN NULL IS NULL THEN ' ' ELSE 'ZZZZ' END)
    ) AS co

GROUP BY co.[CompanyName]
ORDER BY CASE WHEN [CompanyName] = 'Other Companies' THEN 9999 ELSE COUNT(co.[CompanyName]) END DESC;

【讨论】:

  • 这太完美了。谢谢!
  • 我会使用 NULL 而不是 9999,这样无论您拥有什么 COUNT,它总是排在最后 :) 或者甚至更好地将其重写为 ORDER BY CASE WHEN [CompanyName] &lt;&gt; 'Other Companies' THEN COUNT(co.[CompanyName]) END DESC;
  • 我将它切换为 -1,因为它是下降的,但是也可以。谢谢!
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2021-07-14
相关资源
最近更新 更多