2016-08-16 8 views
1

私はORDER BY句をカスタマイズして、 'Other Companies'が常に最後になるようにしようとしています。私はここで何が間違っているのか分からない。ここに私のコードがあります。 WHERE句は重複しているように見えるかもしれませんが、その理由は、このSQL文字列がアップロードされて日付と状態に応じて異なる方法で入力されるマクロコードでパラメータが置き換えられるからです。それを心配しないでください。私はこれまで、2つの異なる列ではなくすべてを注文した別の状況でこれを行ってきました。出力には、ORDER BY句の 'AmountOfClaims'が有効な列ではないことが示されています。誰か助けてくれますか?SQL Order by Customケース注文時

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 
+0

ないすべての重複質問で。 – mattz608

+0

あなたの問題は正確です。あなたは '計算された列'である 'COUNT(co。[CompanyName])'の代わりに '[AmountOfClaims]'を使ってみようとしますが、 'ORDER BY'で' WHERE'の代わりに使用しようとします。 –

答えて

3

あなたが派生テーブルまたはCTEとして、あなたの現在のクエリを使用するか、または単にORDER BYCOUNTを使用することができます。

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; 
+0

これは完璧です。ありがとうございました! – mattz608

+1

9999の代わりに 'NULL'を使用して、いつも' COUNT'をあなたが持っているかどうかにかかわらず最後に来るようにしています:)また、 'ORDER BY CASE WHEN [CompanyName] <> 'というように書き直してください。 co。[CompanyName])END DESC; ' –

+0

降順であるため-1に変更しましたが、うまく機能します。ありがとう! – mattz608