2

簡単な平均を簡単に計算するのに問題があります。私のテーブル:

id / user / action     / data
1  / a    / unit_price / 40
2  / a    / quantity   / 1
3  / b    / unit_price / 70
4  / b    / quantity   / 2

Unit_priceはユーザーの価格であり、数量は数量です。だから私は得る必要があります:(40 + 70 + 70)/ 3 = 60

私がするなら

(AVG(action) WHERE action = unit_price)

私は得る:

(70+40)/2 = 55

私がするなら

(SUM(action) WHERE action = unit_price) / (SUM(action) WHERE action = quantity)

私は得る:

110 / 3 = 36.6

私が見つけた最も簡単な方法は、unit_priceを入力せずに、グローバル価格をPHPコードで除算して、unit_priceを取得することですが、SQLで何かできることを期待していました。

4

6 に答える 6

7
select coalesce(sum(quantity * unit_price) /sum(quantity), 0) from
(select 
   sum(case when action='unit_price' then data else 0 end) as unit_price,
   sum(case when action='quantity' then data else 0 end) as quantity 
 from test
group by user) as a

SqlFiddle

于 2012-10-10T21:28:21.293 に答える
3

基本的にデータをより使いやすい形式にピボットし、必要な値を取得する次のようなものを使用できます。

select avg(unit_price) AvgUnitPrice, 
  sum(unit_price*quantity)/sum(quantity) AvgPrice
from
(
  select user,
    max(case when action = 'unit_price' then data end) unit_price,
    max(case when action = 'quantity' then data end) quantity
  from table1
  group by user
) x;

SQL FiddleWithDemoを参照してください

于 2012-10-10T21:24:00.200 に答える
2

わかりました、明らかにあなたのテーブルデザインは最適ではありません、あなたはunit_priceそしてquantity別々の列として持っているべきです。しかし、あなたが持っているもので作業して、これを試してください:

SELECT SUM(A.data*B.data)/SUM(B.data) Calculation
FROM (  SELECT user, data
        FROM YourTable
        WHERE action = 'unit_price') AS A
INNER JOIN (SELECT user, data
            FROM YourTable
            WHERE action = 'quantity') AS B
ON A.user = B.user
于 2012-10-10T21:17:27.877 に答える
2

2つのレコードを1行にまとめるために、テーブルをそれ自体に結合します

SELECT
    SUM(unit_price * quantity) / SUM(quantity) AS average_unit_price
FROM
    (SELECT
        U.data AS unit_price, Q.data AS quantity
    FROM
        theTable U
        INNER JOIN theTable Q
            ON U.user = Q.user
    WHERE
        U.action = 'unit_price' AND
        Q.action = 'quantity')

ユーザーごとに3つ以上のレコードがあり、両方のレコードのIDが連続している場合は、WHERE句を次のように変更する必要があります。

    WHERE
        U.action = 'unit_price' AND
        Q.action = 'quantity' AND
        U.id + 1 = Q.id 

ノート:

計算AVG(unit_price * quantity)すると、ユーザーあたりの平均合計が得られます。

(1 * 40 + 2 * 70)/ 2 = 90

計算SUM(unit_price * quantity) / SUM(quantity)すると、平均単価が得られます。

(1 * 40 + 2 * 70)/ 3 = 60

于 2012-10-10T21:22:01.277 に答える
0

あなたのテーブルのデザインはよく見えません。

代わりに2つのテーブルを作成します。

ITEM
   ItemId int not null PK, 
   Name varchar(200) not null, 
   UnitPrice decimal (10,2) not null

SALES
   SalesId int not null PK, 
   ItemId int not null FK, 
   Quantity decimal(10,2)

PK-主キー、FK-外部キー

平均:

select 
  I.Name, avg(I.UnitPrice * S.Quantity) as avgSales
from 
  Sales S 
  join Items I on I.ItemId = S.ItemId
group by 
  I.Name
于 2012-10-10T21:13:16.927 に答える
0

このようなものが機能するはずです。私は試していなかったので構文は完璧ではないかもしれませんが、少なくとも主要なアイデアは得られます。

SELECT sumUnitPrice.sum / sumQuantity.sum
FROM
(
  (SELECT SUM(data) as sum
  FROM WhateverTheHellYourTableIsNamed
  WHERE action = 'unit_price') sumUnitPrice

  (SELECT SUM(data) as sum
  FROM WhateverTheHellYourTableIsNamed
  WHERE action = 'quantity') sumQuantity
)
于 2012-10-10T21:16:55.263 に答える