2013-01-11 82 views
0

我有一個表如下。通過範圍限制查詢組記錄

CREATE TABLE budgets(limit_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
        upper_limit INT, 
        lower_limit INT); 

在表中的值如下

INSERT INTO budgets(lower_limit, upper_limit) 
      VALUES(0, 15000), 
        (10200, 15300), 
        (15200, 17002), 
        (30000, 45050), 
        (17002, 30000), 
        (27002, 30500), 
        (30500, 35200), 
        (45200, 55000), 
        (55000, 65020), 
        (25000, 30000), 
        (40000, 60000), 
        (65000, 75000); 

我用如下選擇查詢得到的值

SELECT 'Betw 0 to 25000', COUNT(limit_id) 
    FROM budgets 
WHERE lower_limit>=0 AND upper_limit<=25000 
UNION ALL 
SELECT 'Betw 25000 to 50000', COUNT(limit_id) 
    FROM budgets 
WHERE lower_limit>=25000 AND upper_limit<=50000 
UNION ALL 
SELECT 'Betw 50000 to 75000',COUNT(limit_id) 
    FROM budgets 
    WHERE lower_limit >=50000 AND upper_limit<=75000 

我希望所有的行要根據責任限制範圍以上。

我在表中有12條記錄。

我希望所有記錄都屬於任何一個範圍類別。但通過運行查詢,我只能得到9行記錄在某些條件下。

輸出是

Between 0 to 25000   3 
Between 25000 to 50000  4 
Between 50000 to 75000  2 

其餘3條記錄下不會任何的範圍下降。

幫助我知道我是否在數據庫設計犯了一個錯誤或我寫一個錯誤的查詢中 上述要求

+2

的查詢工作正確。你想達到什麼?我認爲在查詢中存在邏輯錯誤。記錄(17002,30000),(45200,55000),(40000,60000)不在任何範圍內。 –

+0

感謝您的回覆。是的,查詢工作。我想要在任何一個條件下對所有12條記錄進行統計。在輸出查詢中它只顯示9條記錄 – ArrayOutOfBound

+0

請參閱上面的註釋,進行編輯。 –

回答

0

試試這個:

編輯

SELECT IFNULL(CONCAT('Between ', lowerLimit, ' to ',upperLimit), 'Not in Range') bType, COUNT(limit_id) budgetCount 
FROM budgets b 
LEFT JOIN (SELECT 0 lowerLimit, 25000 upperLimit 
      UNION 
      SELECT 25000 lowerLimit, 50000 upperLimit 
      UNION 
      SELECT 50000 lowerLimit, 75000 upperLimit 
     ) A ON b.upper_limit >= A.lowerLimit AND b.lower_limit <= A.upperLimit 
GROUP BY bType; 


SELECT CONCAT('Between ', lowerLimit, ' to ',upperLimit) bType, COUNT(limit_id) budgetCount 
FROM budgets b 
INNER JOIN (SELECT 0 lowerLimit, 25000 upperLimit 
      UNION 
      SELECT 25000 lowerLimit, 50000 upperLimit 
      UNION 
      SELECT 50000 lowerLimit, 75000 upperLimit 
     ) A ON b.upper_limit >= A.lowerLimit AND b.lower_limit <= A.upperLimit 
GROUP BY bType; 

檢查這鏈接SQL FIDDLE DEMO

OUTPUT

|     BTYPE | BUDGETCOUNT | 
---------------------------------------- 
|  Between 0 to 25000 |   3 | 
| Between 25000 to 50000 |   4 | 
| Between 50000 to 75000 |   2 | 
+0

感謝您的回覆。您還沒有理解我的問題 – ArrayOutOfBound

+0

我檢查了您的問題,所以我想知道哪些catecore其餘的3應該有。 –

+0

看到我知道它不屬於任何類別。但如果您有一個需要生成報告(餅圖)的要求,並且您希望將所有記錄歸入任何一個類別,那麼您將如何執行該操作。我認爲我的數據庫設計是錯誤的 – ArrayOutOfBound

1

這將工作

SELECT 'Betw 0 to 25000', COUNT(limit_id) 
    FROM budgets 
WHERE upper_limit>=0 and upper_limit<=25000 
UNION ALL 
SELECT 'Betw 25000 to 50000', COUNT(limit_id) 
    FROM budgets 
WHERE upper_limit>=25000 and upper_limit<=50000 
UNION ALL 
SELECT 'Betw 50000 to 75000',COUNT(limit_id) 
    FROM budgets 
WHERE upper_limit>=50000 and upper_limit<=75000 

輸出將是

Between 0 to 25000   3 
Between 25000 to 50000  5 
Between 50000 to 75000  4