2016-08-16 5 views
1

Я пытаюсь настроить предложение ORDER BY так, чтобы «другие компании» всегда приходили последними. Я не уверен, что здесь не так. Вот мой код. Предложения WHERE могут показаться излишними, но это связано с тем, что параметры заменяются кодом Macros, где эта строка SQL загружается для заполнения по-разному в зависимости от даты и состояния. Не беспокойтесь об этом. Я сделал это раньше для другой ситуации, когда я заказывал все, но не с двумя разными столбцами. Вывод говорит, что «AmountOfClaims» в предложении ORDER BY не является допустимым столбцом. Кто-нибудь может мне помочь?SQL Order by Custom CASE WHEN order

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

Это ваша проблема. Вы пытаетесь использовать '[AmountOfClaims]' вместо 'COUNT (co. [CompanyName])', который является 'вычисленным столбцом', но вместо' WHERE' вы пытаетесь использовать его на 'ORDER BY' –

ответ

3

Вы можете использовать свой текущий запрос в качестве производной таблицы или КТРА, или просто использовать COUNT в ORDER BY:

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] <>« Другие компании »THEN COUNT (co. [CompanyName]) END DESC; ' –

+0

Я переключил его на -1, потому что он спускается, но да, это тоже работает. Благодаря! – mattz608