2014-04-08 7 views
0

У меня есть следующие таблицы базы данных:GROUP BY и сумма составляет

+----------+----------+---------+-----------+------------+-----------+ 
| animalID | foodtype | rAmount | rAmtUnits | rFrequency | rFreqUnit | 
+----------+----------+---------+-----------+------------+-----------+ 
| 3498  | BANA  |  3 | lbs.  |   1 | day  | 
| 3455  | NUTS  |  10 | lbs.  |   1 | day  | 
| 3455  | VEGG  |  20 | lbs.  |   1 | day  | 
| 3450  | NUTS  |  10 | lbs.  |   1 | day  | 
| 3450  | VEGG  |  20 | lbs.  |   1 | day  | 
| 3450  | HAY  |  100 | lbs.  |   1 | day  | 
| 3452  | HAY  |  100 | lbs.  |   1 | day  | 
| 3452  | NUTS  |  10 | lbs.  |   1 | day  | 
| 3452  | VEGG  |  20 | lbs.  |   1 | day  | 
| 9490  | BEFR  |  2 | lbs.  |   1 | day  | 
| 2899  | BEFR  |  2 | lbs.  |   1 | day  | 
| 8393  | ANTS  |  10 | ltr.  |   1 | day  | 
| 8899  | EUCL  |  5 | lbs.  |   1 | day  | 
| 4883  | FISH  |  4 | lbs.  |   1 | day  | 
| 7838  | MICE  |  3 | ea.  |   1 | wk.  | 
| 7838  | RATS  |  1 | ea.  |   2 | wk.  | 
| 4884  | WPLN  |  3 | lbs.  |   1 | wk.  | 
| 1863  | BEFR  |  3 | lbs.  |   1 | day  | 
| 2847  | EUCL  |  3 | lbs.  |   1 | day  | 
| 4336  | BANA  |  2 | lbs.  |   1 | day  | 
| 4336  | NUTS  |  1 | lbs.  |   1 | day  | 
| 4336  | CHWM  |  2 | cups  |   1 | day  | 
| 2856  | CHWM  |  2 | cups  |   1 | day  | 
| 2856  | BANA  |  1 | lbs.  |   1 | day  | 
| 2856  | NUTS  |  2 | lbs.  |   1 | day  | 
| 8483  | NUTS  |  2 | cups  |   1 | day  | 
| 8483  | SEED  |  2 | cups  |   1 | day  | 
+----------+----------+---------+-----------+------------+-----------+ 

И я хочу перечислить количество пищи и необходимых количествах в течение недели. У меня есть следующий запрос:

SELECT foodtype, 
CASE 
    WHEN rFrequency=1 AND rFreqUnit='day' THEN rAmount*7 
    WHEN rFrequency=2 AND rFreqUnit='wk.' THEN rAmount/2 
    ELSE rAmount END AS rAmount, rAmtUnits 
FROM Rations GROUP BY foodtype; 

Но с GROUP BY, столбец rAmount не суммируется, большинство значений просто исчезают. Я ищу способ, чтобы GROUP BY суммировала все значения, которые были бы там без GROUP BY. Любой простой способ сделать это?

+1

Вам необходимо агрегировать столбец rAmount с SUM() – Joe

ответ

0

Похоже, что вы хотите, чтобы обернуть выражение который возвращает rAmount в совокупности SUM.

Похоже, вы не захотите добавлять «фунтов» и «унций» вместе, так что похоже, что вы хотите также «GROUP BY» rAmtUnits.

Учитывая данные в таблице, похоже, что вы хотели бы умножить на 7 всякий раз, когда rFreqUnit является днем. Мне не совсем ясно, что вы хотели бы разделить на 2, в случае, когда rFrequency была установлена ​​на 2. Кажется, что если вам нужно что-то два раза в неделю, вам нужно дважды rAmount. Если вам нужно "N" чего-то в неделю, вы хотите включить "N * rAmount" в общую сумму. Аналогичным образом, если вам нужно было что-то в день, вы должны включить "3 * rAmount * 7" в общую сумму.

Я думаю, что вы хотите что-то вроде этого:

SELECT r.foodtype 
     , SUM(r.rAmount * r.rFrequency * IF(r.rFreqUnit='day',7,1) 
     ) AS rAmount 
     , r.rAmtUnits 
    FROM Rations r 
    GROUP BY r.foodtype, r.rAmtUnits 

ANSI-стандарт эквивалентно выражению "IF(r.rFreqUnit='day',7,1)" бы:

CASE r.rFreqUnit WHEN 'day' THEN 7 ELSE 1 END 
+0

Ах да, разделить на два было ошибкой. Я неправильно читал таблицу, так как это означало 1 крысу каждые две недели. Спасибо хоть! Только то, что мне было нужно. –

+0

Кроме того, в чем смысл делать «Rations r», а затем делать «r.foodtype»? Является ли это тем, как я не очень хорошо разбирался? –

+0

У вас все хорошо. Я просто привык отбирать все ссылки на столбцы в запросе, даже когда ссылается только одна таблица. В запросах, которые ссылаются на несколько таблиц, наилучшей практикой является определение всех ссылок на столбцы в запросе, и это всего лишь шаблон, который так хорошо знаком, я всегда это делаю, даже когда ссылается только одна таблица. – spencer7593

0

Как насчет:

FROM Rations WHERE foodtype = FoodType 

Поместите это в функции (например, яваскрипт, PHP ...), где вы отправляете FoodType в качестве параметра

+0

Я действительно занимался практикой с запросами. Я не использую для этого какой-либо другой веб-код. Спасибо хоть! –