ORDER BY не работает правильно на вычисляемом столбце? - PullRequest
2 голосов
/ 29 января 2020

Мне нужно создать таблицу с топ-1000 сущностей по определенному значению. Я пытаюсь создать таблицу в одном запросе. Я не могу поделиться своими данными, но мой запрос выглядит следующим образом:

SELECT TOP (1000) 
    [A], [B], [C],
    SUM([QTY]) AS Total_QTY
INTO 
    [db].[TopThousandEntities]
FROM 
    [db].[dt]
WHERE 
    [B] NOT LIKE '%Thing'
GROUP BY 
    [A], [B], [C]
ORDER BY 
    SUM([QTY]) DESC

Происходит следующее: мои данные возвращаются так:

A    B    C  Calculated
------------------------
X    Y    Z    100
D    E    F     89

.... следующие 200- 300 верны, т. Е. По убыванию значения ... затем

Q    R    T    92
E    I    U    88
O    U    Z    83

И проблема повторяется в циклах до строки 1000. Есть мысли о том, что может происходить?

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Ваша проблема заключается в том, что вы проверяете данные, используя:

select *
from [db].[TopThousandEntities];

SQL таблицы представляют неупорядоченные наборы. Порядок упорядочения отсутствует, если вы не укажете предложение ORDER BY.

Итак, если вы хотите видеть их по порядку:

select *
from [db].[TopThousandEntities]
order by Total_QTY desc;

Если вы хотите сохранить исходный порядок в таблице, вы можете добавить столбец идентификаторов:

SELECT TOP (1000) IDENTITY(int) as TopThousandEntities_id,
       [A], [B], [C],
       SUM([QTY]) AS Total_QTY
INTO  [db].[TopThousandEntities]
FROM [db].[dt]
WHERE [B] NOT LIKE '%Thing'
GROUP BY [A], [B], [C]
ORDER BY SUM([QTY]) DESC;

Теперь вы можете заказать по столбцу идентификаторов:

select *
from [db].[TopThousandEntities]
order by TopThousandEntities;
1 голос
/ 29 января 2020

Группировка применяется перед заказом. Чтобы получить нужный порядок, при условии, что вы также хотите, чтобы TOP относился к Total_qty, переместите ORDER BY и TOP во внешнее предложение select, например, так:

SELECT TOP (1000) c.*
FROM (
   SELECT 
        [A]
        ,[B]
        ,[C]
        ,SUM([QTY]) AS Total_QTY
    FROM [db].[dt]
    WHERE [B] NOT LIKE '%Thing'
    GROUP BY [A]
        ,[B]
        ,[C]
    ) x
ORDER BY x.Total_QTY DESC
...