ORDER BY без Total в SQL

У меня есть этот SQL-запрос, который использует ROLLUP для получения суммы, но также должен упорядочить каждую вторую строку по сумме:

SELECT 
    ISNULL([SharepointId], 'Total') as 'Sharepoint', 
    Count([Id]) as 'Nombre de tickets' 
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY 2 DESC, 1

Есть ли способ убедиться, что общая сумма остается в конце результатов, сохраняя при этом порядок убывания других строк?

На данный момент я получаю следующее:

Sharepoint         Nombre de tickets
------------------ -----------------
Total              20326
INTERNE            9396
MAIN               1503
...

Если вы измените предложение order by на возрастание, то вы обязательно убедитесь, что сумма всегда будет последней, если только все счетчики билетов не равны нулю: ORDER BY 2 ASC, 1

Peter Abolins 16.05.2018 12:00

@PeterAbolins Если бы это было так просто, мне нужно сохранить порядок убывания.

Halex 16.05.2018 12:03
ORDER BY GROUPING([SharepointId]), COUNT([id]) DESC: docs.microsoft.com/en-us/sql/t-sql/functions/…
MatBailie 16.05.2018 12:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
123
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Измените предложение Order By, как показано ниже:

CASE WHEN  ISNULL([SharepointId], 'Total') <>'Total' THEN  
Count([Id])END DESC, 1

Попробуй это

SELECT 
    ISNULL([SharepointId], 'Total') as [Sharepoint], 
    Count([Id]) as [Nombre de tickets]
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY CASE WHEN [SharepointId] IS NULL THEN 'B' ELSE 'A' END, [Nombre de tickets] DESC

Я не могу просто добавить еще один бессмысленный столбец, поскольку результат должен быть удобочитаемым.

Halex 16.05.2018 12:09

Это не сработает, я не думаю, что ISNULL можно использовать таким образом.

Halex 16.05.2018 12:16

это была просто опечатка. Добавлен пробел, чтобы сделать его ПУСТО (NULL)

B3S 16.05.2018 12:19

Спасибо! закончился слиянием обоих ответов с ORDER BY CASE WHEN [SharepointId] IS NOT NULL THEN Count([Id]) END DESC, 1

Halex 16.05.2018 12:22

рад помочь ;)

B3S 16.05.2018 12:23

Простое использование выражения case:

order by (case when SharepointId is null then 1 else 0 end), [Nombre de tickets] desc;
Ответ принят как подходящий

Другие ответы неверно представляют то, что вы хотите.

  • Вы не хотите, чтобы строка была последней, потому что она NULL
  • Вы хотите, чтобы строка была последней, потому что она сгруппирована


В SQL Server есть функция именно для этого, и на странице документации есть почти в точности ваш пример ...


SELECT 
    ISNULL([SharepointId], 'Total') as 'Sharepoint', 
    Count([Id]) as 'Nombre de tickets' 
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY GROUPING([SharepointId]), 2 DESC

GROUPING([SharepointId]) - это 0, когда столбец нет сгруппирован (так что эти строки сортируются первыми), а затем это 1, когда столбец является сгруппирован (так что эта строка идет последней). Это особенно полезно при сворачивании нескольких столбцов.

Спасибо! Я знал, что есть более чистый способ сделать это.

Halex 16.05.2018 13:54

Другие вопросы по теме