Используя COUNT с CASE, как упорядочить результирующие столбцы? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть следующий код:

SELECT COUNT(CASE WHEN Title LIKE '%Superintendent%' THEN 1 END) AS 'Bob',
       COUNT(CASE WHEN Title LIKE '%Machine%' THEN 1 END) AS 'Control',
       COUNT(CASE WHEN Title LIKE '%Estimator%' THEN 1 END) AS 'Estimator'
FROM pants;

Текущий результат выглядит следующим образом:

Bob   Control   Estimator
230   550       1243

Вместо этого я хотел бы, чтобы в результате просмотра запроса были столбцы по убываниюзаказ: Оценщик -> Контроль -> Боб

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Сортировка SQL предназначена для упорядочивания строк, а не столбцов.Чтобы изменить порядок столбцов в выходных данных, необходимо упорядочить данные, а затем построить динамический запрос, чтобы вернуть столбцы в правильном порядке.Однако гораздо проще выполнить первую часть (упорядочение данных), если такой результат будет приемлем для того, что вам нужно.

Name       Total
Estimator  1243
Control    550
Bob        230

Этот запрос может выглядеть примерно так (мой MySQLсинтаксис ржавый, но это должно быть близко)

SELECT 'Bob' as Name, COUNT(CASE WHEN Title LIKE '%Superintendent%' THEN 1 END) AS Total From Pants
UNION ALL
SELECT 'Control' as Name, COUNT(CASE WHEN Title LIKE '%Machine%' THEN 1 END) AS Total From Pants
UNION ALL
SELECT 'Estimator' as Name, COUNT(CASE WHEN Title LIKE '%Estimator%' THEN 1 END) AS Total From Pants
ORDER BY Total desc;
0 голосов
/ 27 февраля 2019
; 
WITH cte AS 
( 
       SELECT dtls, 
              pantcounts 
       FROM   ( 
                     SELECT Count( 
                            CASE 
                                   WHEN title LIKE '%Superintendent%' THEN 1 
                            END) AS 'Bob', 
                            Count( 
                            CASE 
                                   WHEN title LIKE '%Machine%' THEN 1 
                            END) AS 'Control', 
                            Count( 
                            CASE 
                                   WHEN title LIKE '%Estimator%' THEN 1 
                            END) AS 'Estimator' 
                     FROM   pants) P UNPIVOT (pantcounts FOR dtls IN (bob, 
                                                                      [Control], 
                                                                      [Estimator])) AS unp 
       select   dtls, 
                pantcounts, 
                row_number() OVER (ORDER BY pantcounts DESC) AS rownum 
       FROM     cte

Это даст необходимые отсортированные данные в строке.Затем сервисный уровень должен выполнить транспонирование из строки в столбец.

0 голосов
/ 27 февраля 2019

Не рекомендуется динамически возиться с порядком столбцов в наборе результатов.Вместо этого в запросе должен быть результирующий набор с очень предсказуемым (в идеале статичным) набором столбцов.

Переупорядочение столбцов - это, я бы порекомендовал, задача, которую визуализирует этот набор результатов после того, как база данных вернет его.

...