2015-03-03 64 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'嗎?然後,如果價格段增加,我不必寫很多'案件..'。

我試圖用「聲明」和「而」,但沒有得到它的工作。在這種情況下如何爲循環設置變量?

+0

最好不要使用WHLE循環 – sqluser 2015-03-03 00:38:35

+0

有什麼不對您當前的一個?添加一個循環會降低速度並使其變得複雜。 – 2015-03-03 00:41:44

+0

目前一個工作正常,因爲現在我只列出少於10個組。但是如果在實際分析中我需要50個組,那麼做一個循環比重複輸入那些「when..then ..」要容易得多50次 – Kevin 2015-03-03 21:27:09

回答

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 2015-03-03 21:38:28

+0

你真的不應該想到SQL中的循環。使用我在這裏展示的正確方法是執行'CREATE'和'INSERT'一次,並根據需要重複'SELECT'。 – 2015-03-03 22:37:23