помочь с запросом MySQL - PullRequest
0 голосов
/ 31 августа 2011

У меня есть БД со всеми транзакциями моего интернет-магазина, и я пытаюсь сделать запрос, чтобы распечатать простой финансовый отчет.

это будет напечатано в таблице следующим образом:

<th>month</th>
<th>number of sales</th>
<th>money in</th>
<th>money out</th>
<th>result</th>

запрос, который завершается неудачно с: # 1111 - Неправильное использование групповой функции

SELECT 
month(transaction_date) as month,
count(incoming_amount > '0') as number_of_sales,
sum(incoming_amount / 1.25) as money_in,
sum(outgoing_amount) as money_out,
sum((incoming_amount / 1.25) - sum(outgoing_amount)) as result
FROM myDB WHERE year(timestamp) = '2011' order by id desc");

Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

2 голосов
/ 31 августа 2011
SELECT 
month(transaction_date) as month,
sum(if(incoming_amount>0,1,0)) as number_of_sales,
sum(incoming_amount)/1.25 as money_in,
sum(outgoing_amount) as money_out,
sum((incoming_amount/1.25)-outgoing_amount) as result
FROM myDB 
WHERE timestamp>='2011-01-01 00:00:00' AND timestamp<='2011-12-11 23:59:59'
GROUP BY month;
  1. вам нужно указать столбец при использовании агрегатной функции
  2. year(timestamp) не используется для индекса mysql (если вы указали индекс для метки времени)
  3. агрегатная функция на count(incoming_amount > '0') неверна
  4. sum тоже не выглядит правильно
1 голос
/ 31 августа 2011

Опираясь на ответ @ ajreal, вы можете ускорить этот запрос, повторно использовав предварительно рассчитанные значения, например:

SELECT s.*,
       (s.money_in - s.money_out) as result 
FROM
  (
  SELECT 
    month(transaction_date) as month,
    /*  year(transaction_date) as year   */  
    sum(incoming_amount>0) as number_of_sales, -- true = 1, false = 0.
    sum(incoming_amount)/1.25 as money_in,
    sum(outgoing_amount) as money_out,
  FROM myDB 
  WHERE transaction_date BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59'
  GROUP BY /*year,*/ month DESC;
  ) AS s

Если вы выберете более года, раскомментируйте соответствующие разделы.
Обратите внимание, что вы можете добавить модификатор DESC к group by, чтобы сначала получить самые свежие результаты.

1 голос
/ 31 августа 2011

Добавить группу по заявке:

SELECT 
month(transaction_date) as month,
count(incoming_amount > '0') as number_of_sales,
sum(incoming_amount / 1.25) as money_in,
sum(outgoing_amount) as money_out,
sum((incoming_amount / 1.25) - sum(outgoing_amount)) as result
FROM myDB WHERE year(timestamp) = '2011' GROUP BY month order by id desc");
...