0

オンライン Web ショップのすべてのトランザクションを含む DB があり、単純な財務諸表を印刷するためのクエリを作成しようとしています。

次のような表に出力されます。

<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");

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

2
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. 集計関数 oncount(incoming_amount > '0')が正しくありません
  4. sumも正しく見えません
于 2011-08-31T12:46:21.040 に答える
1

group by ステートメントを追加します。

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");
于 2011-08-31T12:48:01.700 に答える
1

@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

年を超えて選択する場合は、関連するセクションのコメントを外してください。修飾子を追加して、最新の結果を最初に取得
できることに注意してください。DESCgroup by

于 2011-08-31T13:08:59.220 に答える