2015-03-03 3 views
0

Я использую MSSQL для запуска запроса, однако я хочу просто выполнить мои текущие шаги, используя цикл.MSSQL_Как показывать диапазон номеров по петле?

-- My current script 
select product, price,price_range 
from 
     (select 
       product, 
       price, 
       case 
         when price <= 100 then 'upto100' 
         when price between 101 and 200 then '101-200' 
         when price between 201 and 300 then '201-300' 
         when price between 301 and 400 then '301-400' 
         when price between 401 and 500 then '401-500' 
         when price between 501 and 600 then '501-600' 
         when price between 601 and 700 then '601-700' 
         when price between 701 and 800 then '701-800' 
         when price >= 801 then '800+EURO' 
       end as price_range 
     from DATA) as A 

Теперь мой скрипт работает, он возвращает мне правильный результат, как я хотел:

product price  price_range 
shoes  50  upto100 
clothes 456  401-500 
computer 1500  800+EURO 

НО, я могу сделать это просто? Могу ли я каким-то образом использовать циклы вместо «case ... when ... then»? Тогда, если сегменты роста цен, мне не нужно писать много «случая».

Я попытался использовать 'declare' и 'while', но не получилось. Как установить переменную для циклов в этом случае?

+0

Лучше не использовать WHLE цикл – sqluser

+0

Что случилось с вашей текущей? Добавление цикла замедлит его и сделает его сложным. –

+0

Текущий работает отлично, потому что теперь я перечисляю менее 10 групп. Но если бы в реальном анализе мне понадобилось бы 50 групп, создание цикла было бы проще, чем повторение ввода «when..then ..» 50 раз – Kevin

ответ

1

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

Что-то вроде:

CREATE TABLE price_ranges (
    lowest INT, 
    highest INT, 
    name VARCHAR 
) 

INSERT INTO price_ranges VALUES (
    (NULL, 100, 'upto100'), 
    (101, 201, '101-200), 
    ... 
    (801, NULL, '801+EURO') 
) 

SELECT DATA.product, DATA.price, RANGES.name AS price_range 
    FROM DATA, 
     price_ranges RANGES 
    WHERE (DATA.price >= RANGES.lowest OR RANGES.lowest IS NULL) 
    AND (DATA.price <= RANGES.highest OR RANGES.highest IS NULL) 
AS A 
+0

Я буду использовать этот вид запросов довольно часто, поэтому я действительно хотел разобраться в этом , Было бы возможно, если бы мы установили цикл для «101,201,301 ...»? Мне нужно больше диапазонов в моем реальном анализе, чем то, что я перечислил. Вот почему я хотел найти простой способ вместо жесткого кодирования. – Kevin

+0

Вы действительно не должны думать о циклах в SQL. И правильный способ использовать то, что я показал здесь, - это сделать «CREATE» и «INSERT» один раз и повторить «SELECT» так часто, как это необходимо. –

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