ВЫБЕРИТЕ поля данных с несколькими группами и суммами - PullRequest
0 голосов
/ 31 января 2012

Кажется, я не могу сгруппировать по нескольким полям данных и суммировать определенный сгруппированный столбец.

Я хочу сгруппировать Person по клиенту, а затем сгруппировать клиента по цене, а затем суммировать цену.Человек с самой высокой суммой (ценой) должен быть указан в порядке возрастания.

Пример:

table customer
-----------
customer | common_id
 green        2
 blue         2
 orange       1

table invoice
 ----------
 person | price | common_id
 bob        2330     1
 greg       360      2    
 greg       170      2

SELECT DISTINCT
    min(person) As person,min(customer) AS customer, sum(price) as price
FROM invoice a LEFT JOIN customer b ON a.common_id = b.common_id 
GROUP BY customer,price
ORDER BY person

Я хочу получить следующие результаты:

**BOB:** 
Orange, $2230

**GREG:**
green,  $360
blue,$170

The colors are the customer, that GREG and Bob handle. Each color has a price. 

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Есть две проблемы, которые я вижу.Один немного требователен, а другой довольно фундаментален.

Представление данных в SQL

SQL возвращает наборы табличных данных.Он не может возвращать подмножества с заголовками, что-то похожее на сводную таблицу.

Это означает, что это невозможно ...

**BOB:** 
Orange, $2230

**GREG:**
green,  $360
blue,   $170

Но это есть возможно ...

Bob,  Orange, $2230
Greg, Green,  $360
Greg, Blue,   $170

Связанные данные

Я могу визуально увидеть, как вы связываете данные вместе ...

table customer                 table invoice
--------------                 -------------
customer | common_id           person | price |common_id
 green        2                 greg     360       2
 blue         2                 greg     170       2
 orange       1                 bob     2330       1

Но SQL не имеет никакого подразумеваемого порядка.Вещи могут быть связаны, только если выражение может утверждать, что они связаны.Например, следующее в равной степени возможно ...

table customer                 table invoice
--------------                 -------------
customer | common_id           person | price |common_id
 green        2                 greg     170       2      \ These two have 
 blue         2                 greg     360       2      / been swapped
 orange       1                 bob     2330       1

Это означает, что вам нужны правила (и, вероятно, дополнительные поля), которые явно указывают, какая запись customer соответствует какой записи invoice, особенно когдакратны в обоих с одинаковыми common_id.

Примером правила может быть, самая низкая цена всегда совпадает с первым клиентом в алфавитном порядке.Но что произойдет, если у вас есть три записей в customer для common_id = 2, но только две записей в invoice за common_id = 2?Или количество записей всегда совпадает, и вы обязуетесь к этому?

Скорее всего, вам понадобится дополнительная часть (или части) информации, чтобы знал , какие записи связаны друг с другом.

0 голосов
/ 31 января 2012

Я не уверен, как ты мог это сделать. У Грега есть 2 цвета и 2 цены, как вы определяете, что с каким?

Грег Блю 170 или Грег Блю 360 ???? или присоединение Грина к любой цене?

Я думаю, что цвета должны иметь уникальные идентификаторы, отделенные от уникальных идентификаторов.

Просто мысль.

0 голосов
/ 31 января 2012

Вы должны сгруппировать, используя все выбранные поля, кроме суммы, тогда, возможно, функция group_concat (mysql) поможет вам объединить результирующие строки предложения group

...