Эмулировать группу по, по порядку, по ограничению от mysql до ms sql 2000

У меня есть запрос в MySQL:

select slscod,slsname,brc
from td_casa
group by slscod
order by slsname
limit 0,100

Этот запрос извлекает 100 лучших уникальных кодов продаж с slsname и brc, упорядоченных по slsname по возрастанию.

Как изменить этот запрос в MSSQL 2000?


person Irfani Firdausy    schedule 26.10.2011    source источник
comment
Вы пробовали запустить его на SQL Server? Возвращает ли он какие-либо сообщения об ошибках?   -  person a'r    schedule 26.10.2011
comment
@ a'r: это недопустимый синтаксис SQL Server, что довольно очевидно. Вот почему был задан вопрос ...   -  person gbn    schedule 26.10.2011


Ответы (3)


Основной синтаксис:

select top 100 slscod,slsname,brc 
from td_casa 
group by slscod 
order by slsname
person Sparky    schedule 26.10.2011
comment
не работает, я получаю сообщение об ошибке: [Err] 42000 - [SQL Server] Столбец 'td_casa.slsname' недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY. - person Irfani Firdausy; 26.10.2011

SELECT TOP 100 slscod, slsname, brc
FROM td_casa
GROUP BY slscod, slsname, brc
ORDER BY slsname

Примечание. Что касается вашего комментария о Столбец 'xyz' недействителен в ошибке select ..., я заметил, что вы выбрали 3 столбца, но указали 1 столбец в предложении GROUP BY. Это специфическое для MySQL поведение, описанное здесь:

MySQL расширяет использование GROUP BY, чтобы разрешить выбор полей, которые не упомянуты в предложении GROUP BY. Если вы не получаете ожидаемых результатов от своего запроса, прочтите описание GROUP BY в Разделе 11.15, «Функции и модификаторы для использования с предложениями GROUP BY».

person Salman A    schedule 26.10.2011
comment
У меня снова возникла проблема, если взять ограничение, например, в mysql я хочу взять начальную запись от 30 до 100. Это было в запросе mysql: выберите slscod, slsname, brc из группы td_casa по порядку slscod по пределу slsname 30,100. Как изменить этот запрос в MSSQL 2000? - person Irfani Firdausy; 26.10.2011
comment
@IrfaniFirdausy: См. Это: stackoverflow.com/questions/2135418/ - person ypercubeᵀᴹ; 26.10.2011
comment
Боюсь, что с MSSQL2000 у вас связаны руки. Но на это стоит обратить внимание: stackoverflow.com/questions/595123/ - person Salman A; 26.10.2011
comment
Ах да, SQL-Server-2000 имеет ограниченные возможности для версии OFFSET. См. Также эту статью: 4guysfromrolla.com/webtech/041206-1.shtml - person ypercubeᵀᴹ; 26.10.2011
comment
И ответ @leoinfo: stackoverflow.com/questions/ 187998 / row-offset-in-sql-server - person ypercubeᵀᴹ; 26.10.2011
comment
И довольно старая статья с некоторым анализом производительности различных методов (не все применимы к SQL-Server 2000): codeproject.com/KB/aspnet/PagingLarge.aspx - person ypercubeᵀᴹ; 26.10.2011
comment
Вместо использования MIN просто расширите предложение GROUP BY, включив в него все выбранные столбцы. Оба метода вернут одинаковые результаты (при условии, что sslcod является первичным / уникальным ключом). - person Salman A; 26.10.2011
comment
наконец, я нашел этот запрос. Я отвечу завтра. потому что упс! Ваш ответ не может быть отправлен, потому что: Пользователи с репутацией менее 100 не могут ответить на свой вопрос в течение 8 часов после запроса. :) - person Irfani Firdausy; 26.10.2011

поскольку в MSSQL 2000 не поддерживаются ROW_NUMBER() и LIMIT ... OFFSET .., наконец, я нашел этот запрос:

SELECT slscod, MIN(slsname) slsname, MIN(brc) brc FROM (
    SELECT top 30 slscod, MIN(slsname) slsname, MIN(brc) brc FROM
    (
        SELECT TOP (1*30) slscod, MIN(slsname) slsname, MIN(brc) brc
        FROM td_casa group by slscod
        ORDER BY slsname ASC
    ) AS t1 group by slscod
     ORDER BY slsname DESC ) AS t2 group by slscod ORDER BY MIN(slsname) ASC

То же самое, если в mysql:

select slscod,slsname,brc from td_casa group by slscod order by slsname limit 0,30

если вы измените TOP (2*30), это то же самое limit 30,30. TOP (3*30) это то же limit 60,30 и тд.

отчаянная потребность в усилиях. спасибо всем. будем ура

person Irfani Firdausy    schedule 27.10.2011