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 つのレコードは、いずれの範囲にも該当しません。

DB の設計を間違えたのか、それとも上記の要件に対して間違ったクエリを書いているのか教えてください。

4

2 に答える 2

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
于 2013-01-11T10:06:04.660 に答える
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

出力

|                  BTYPE | BUDGETCOUNT |
----------------------------------------
|     Between 0 to 25000 |           3 |
| Between 25000 to 50000 |           4 |
| Between 50000 to 75000 |           2 |
于 2013-01-11T08:50:02.003 に答える