2012-03-04 2 views
0

Я после этой серии статей, чтобы узнать о ROLLUP и CUBEтот же запрос выборки разные результаты

http://beyondrelational.com/modules/2/blogs/28/posts/10471/tsql-lab-6-using-with-cube-to-generate-subtotal-and-grand-total-rows.aspx

Для этого запроса:

select 
    case 
     when grouping(CustomerName) = 1 then 'All Customers' 
     else CustomerName 
    end as CustomerName, 
    case 
     when grouping(ItemName) = 1 then 'All Items' 
     else ItemName 
    end as ItemName, 
    sum(quantity*pricepercase) as Amount1 
from orders 
group by CustomerName, ItemName 
with cube 

Автор результат:

CustomerName   ItemName    Amount 
-------------------- -------------------- --------------------- 
Jacob    Item 1    312.50 
Jacob    Item 2    480.00 
Jacob    All Items   792.50 
Mike     Item 1    75.00 
Mike     Item 2    44.00 
Mike     All Items   119.00 
All Customers  All Items   911.50 
All Customers  Item 1    387.50 
All Customers  Item 2    524.00 

Две дополнительные строки, сгенерированные кубом, являются последними 2 строками. Я получаю такие результаты:

CustomerName   ItemName    Amount 
-------------------- -------------------- --------------------- 
Jacob    Item 1    312.50 
Mike     Item 1    75.00 
All Customers  Item 1    387.50 
Jacob    Item 2    480.00 
Mike     Item 2    44.00 
All Customers  Item 2    524.00 
All Customers  All Items   911.50 
Jacob    All Items   792.50 
Mike     All Items   119.00 

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

+0

отредактирован для включения запроса. – Animesh

+2

Не используйте 'WITH CUBE' http://msdn.microsoft.com/en-us/library/ms177673.aspx * Используйте синтаксис, совместимый с ISO, для всей новой работы. Синтаксис, не совместимый с ISO, предусмотрен для обратной совместимости. * –

+0

Oh! Это хорошо знать. 'CUBE (elem1, elem2)' вместо 'WITH CUBE' – Animesh

ответ

2

IIRC SQL не гарантирует никакого заказа, кроме случаев, когда у вас явно есть ORDER BY на месте ... иногда разные версии SQL Server/patchlevels «заказывают» по-другому без ORDER BY.

Я не знаю, произвел ли автор этого результата с помощью SQL Server 2005 или 2008 или 2008 R2 и т.д., но я higghly подозреваю, что это является причиной того, что вы видите ...

Если вам нужен конкретный порядок в наборе результатов всегда использует явное предложение ORDER BY!

+0

Хорошо, я подозревал, что это может быть так, что заказ не гарантируется. Однако, если я делаю 'rollup' вместо' cube', я получаю тот же порядок результатов, что и автор. Именно тогда я подумал, может ли это быть чем-то другим. Как вы сказали, автор, возможно, использовал другую версию SQL Server. – Animesh

+0

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

+0

@ KishorNanda любой поставщик БД может свободно изменять внутренние алгоритмы так, как только результат соответствует стандартам - это затрудняет определение того, какая функция может быть связана с такими изменениями ... – Yahia

Смежные вопросы