2016-02-01 1 views
0

запрос:MYSQL GROUP BY HAVING положение unsing MIN и MAX для диапазона

SELECT product_cd, SUM(avail_balance) prod_balance 
FROM account 
WHERE status = 'ACTIVE' 
GROUP BY product_cd 
HAVING MIN(avail_balance) >= 1000 
AND MAX(avail_balance) <= 10000; 

Стол:

+------------+------------+---------+------------+------------+--------------------+--------+----------------+-------------+---------------+-----------------+ 
| account_id | product_cd | cust_id | open_date | close_date | last_activity_date | status | open_branch_id | open_emp_id | avail_balance | pending_balance | 
+------------+------------+---------+------------+------------+--------------------+--------+----------------+-------------+---------------+-----------------+ 
|   1 | CHK  |  1 | 2000-01-15 | NULL  | 2005-01-04   | ACTIVE |    2 |   10 |  1057.75 |   1057.75 | 
|   2 | SAV  |  1 | 2000-01-15 | NULL  | 2004-12-19   | ACTIVE |    2 |   10 |  500.00 |   500.00 | 
|   3 | CD   |  1 | 2004-06-30 | NULL  | 2004-06-30   | ACTIVE |    2 |   10 |  3000.00 |   3000.00 | 
|   4 | CHK  |  2 | 2001-03-12 | NULL  | 2004-12-27   | ACTIVE |    2 |   10 |  2258.02 |   2258.02 | 
|   5 | SAV  |  2 | 2001-03-12 | NULL  | 2004-12-11   | ACTIVE |    2 |   10 |  200.00 |   200.00 | 
|   7 | CHK  |  3 | 2002-11-23 | NULL  | 2004-11-30   | ACTIVE |    3 |   13 |  1057.75 |   1057.75 | 
|   8 | MM   |  3 | 2002-12-15 | NULL  | 2004-12-05   | ACTIVE |    3 |   13 |  2212.50 |   2212.50 | 
|   10 | CHK  |  4 | 2003-09-12 | NULL  | 2005-01-03   | ACTIVE |    1 |   1 |  534.12 |   534.12 | 
|   11 | SAV  |  4 | 2000-01-15 | NULL  | 2004-10-24   | ACTIVE |    1 |   1 |  767.77 |   767.77 | 
|   12 | MM   |  4 | 2004-09-30 | NULL  | 2004-11-11   | ACTIVE |    1 |   1 |  5487.09 |   5487.09 | 
|   13 | CHK  |  5 | 2004-01-27 | NULL  | 2005-01-05   | ACTIVE |    4 |   16 |  2237.97 |   2897.97 | 
|   14 | CHK  |  6 | 2002-08-24 | NULL  | 2004-11-29   | ACTIVE |    1 |   1 |  122.37 |   122.37 | 
|   15 | CD   |  6 | 2004-12-28 | NULL  | 2004-12-28   | ACTIVE |    1 |   1 |  10000.00 |  10000.00 | 
|   17 | CD   |  7 | 2004-01-12 | NULL  | 2004-01-12   | ACTIVE |    2 |   10 |  5000.00 |   5000.00 | 
|   18 | CHK  |  8 | 2001-05-23 | NULL  | 2005-01-03   | ACTIVE |    4 |   16 |  3487.19 |   3487.19 | 
|   19 | SAV  |  8 | 2001-05-23 | NULL  | 2004-10-12   | ACTIVE |    4 |   16 |  387.99 |   387.99 | 
|   21 | CHK  |  9 | 2003-07-30 | NULL  | 2004-12-15   | ACTIVE |    1 |   1 |  125.67 |   125.67 | 
|   22 | MM   |  9 | 2004-10-28 | NULL  | 2004-10-28   | ACTIVE |    1 |   1 |  9345.55 |   9845.55 | 
|   23 | CD   |  9 | 2004-06-30 | NULL  | 2004-06-30   | ACTIVE |    1 |   1 |  1500.00 |   1500.00 | 
|   24 | CHK  |  10 | 2002-09-30 | NULL  | 2004-12-15   | ACTIVE |    4 |   16 |  23575.12 |  23575.12 | 
|   25 | BUS  |  10 | 2002-10-01 | NULL  | 2004-08-28   | ACTIVE |    4 |   16 |   0.00 |   0.00 | 
|   27 | BUS  |  11 | 2004-03-22 | NULL  | 2004-11-14   | ACTIVE |    2 |   10 |  9345.55 |   9345.55 | 
|   28 | CHK  |  12 | 2003-07-30 | NULL  | 2004-12-15   | ACTIVE |    4 |   16 |  38552.05 |  38552.05 | 
|   29 | SBL  |  13 | 2004-02-22 | NULL  | 2004-12-17   | ACTIVE |    3 |   13 |  50000.00 |  50000.00 | 
+------------+------------+---------+------------+------------+--------------------+--------+----------------+-------------+---------------+-----------------+ 

Результат:

+------------+--------------+ 
| product_cd | prod_balance | 
+------------+--------------+ 
| CD   |  19500.00 | 
| MM   |  17045.14 | 
+------------+--------------+ 

Мое понимание идет, насколько это, из запроса выше:

SELECT product_cd, SUM(avail_balance) prod_balance 
FROM account 
WHERE status = 'ACTIVE' 
GROUP BY product_cd 

Каких результатов в:

+------------+--------------+ 
| product_cd | prod_balance | 
+------------+--------------+ 
| BUS  |  9345.55 | 
| CD   |  19500.00 | 
| CHK  |  73008.01 | 
| MM   |  17045.14 | 
| SAV  |  1855.76 | 
| SBL  |  50000.00 | 
+------------+--------------+ 

Моей путанице с:

HAVING MIN(avail_balance) >= 1000 
AND MAX(avail_balance) <= 10000; 

Что я интерпретирую как: «Включить только те, имеющие баланс, который больше или равен 1000 и меньше, чем или равна 10000" , который приведет к

BUS: 9345.55

SAV: 1855.76

Это совершенно неправильно, когда я выполнил запрос, как указано выше. Любые объяснения относительно того, что происходит, помогут.

+0

неправильная группировка. поскольку вы группируете 'product_cd', вы получите значения max/min для ВСЕХ записей в каждой группе, независимо от того, какой пользователь на самом деле их имеет. плюс, 'has' применяется в основном на самом последнем этапе обработки запросов, как раз перед передачей данных пользователю. Это означает, что фильтр применяется ПОСЛЕ того, что вся сумма/где материал был финализирован, что также означает, что любые значения, которые '' '' обычно будут исключать, уже будут включены в какие-либо агрегированные результаты, такие как 'sum()'. –

ответ

0

вместо MIN (avail_balance) и MIN (avail_balance), попробуйте

HAVING MIN(SUM(avail_balance)) >=1000 
and MAX(SUM(avail_balance)) <=10000 

Вы получаете CD и ММ в результате Beacause все их значения находятся в пределах от 1000 до 10000

0

ли вам хотите, чтобы общий или минимальный или максимальный avail_balance соответствовали определенному диапазону? Это разные вещи.

В компакт-диске с продуктом, например, имеется в общей сложности 19500, как минимум 1500 и не более 10000. Вы показываете общее количество (SUM), но хотите видеть результаты, в которых минимальный размер продукта (MIN) составляет> = 1000 и максимум продукта (MAX) равен < = 10000. Это справедливо для компакт-диска.

Таким образом, ваш запрос показывает правильные результаты.

Может быть, вы хотите, это, может быть, вы хотите

SELECT 
    product_cd, 
    SUM(avail_balance) AS prod_balance 
FROM account 
WHERE status = 'ACTIVE' 
GROUP BY product_cd 
HAVING SUM(avail_balance) >= 1000 
AND SUM(avail_balance) <= 10000; 

вместо этого.