2012-10-10 78 views
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

如果我這樣做an

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

我得到:

110/3 = 36.6

,我發現最簡單的方法就是不要把UNIT_PRICE但全球價格則使PHP代碼的劃分,以獲得UNIT_PRICE,但我希望能SQL爲我做點事情。

+0

我不認爲你的任何解決方案可以工作,但我需要更具體:1 /這只是全局請求的一部分,所以我認爲我將無法添加更多的聯接和內部SELECT 2 /獲得一個單位unit_price和單獨的數量不會改變問題3 /是的,我不想要一個特定用戶的平均價格,但全球4 /正確的答案通過乘以數量和unit_price爲每個用戶然後經典的平均數學 – pierreaurelemartin

+0

Lamak's和Olivier的答案似乎完美地回答了你的問題。 (在一些假設下)bluefeet和Raphael也是如此。如果你的查詢/要求比較複雜,那麼回答者就沒有心理上的能力來猜測這些是什麼。 –

+0

好吧,我得到了很好的答案。只需要找出如何把它放在我的大查詢中。感謝所有人 – pierreaurelemartin

回答

6
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

+0

是的,它的工作,謝謝;-) – pierreaurelemartin

+0

拉斐爾 - 快速SQL小提示 - 您可以複製和粘貼OP的示例數據到「文本到DDL」工具來快速構建需要查詢的表和數據。例如,下面是針對我構建的模式運行的查詢:http://sqlfiddle.com/#!2/dfd1a/1 –

+0

@JakeFeasel哦,哦,你救了我的一天(剛剛開始這是一個好的開始)。謝謝 ! –

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 
+0

儘管可能出現表結構不理想的情況,但有時候更改模式是不可能的。考慮到他目前的模式,OP所要求的是完全可能的。 – Jim

+0

是的,我同意,但我們應該明確表示解決方案不「理想」。如果有理由應該明確說明。 –

+0

那麼我知道它看起來像一個簡單的ordre網站,但它不是,我真的需要在同一個表中獲得這兩個信息。我應該說的是,我的全球查詢比我顯示的部分複雜得多... – pierreaurelemartin

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 
) 
2

好吧,顯然你的表的設計是不是最佳的,你應該有unit_pricequantity作爲單獨的列。但是,你有什麼工作,試試這個:

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 
+0

OP的問題需要澄清,但他似乎希望結果是(SUM單價)/(數量總和),而不會被用戶煮沸。 – Jim

+0

@Jim - 我誤解了這個問題,儘管我認爲這個操作需要與我發佈的內容不同,所以我更新了我的答案以反映這一點。 – Lamak

+0

@ypercube - 這是從哪裏來的? – Lamak

2

我會加入表本身爲了得到這兩個記錄在一行

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') 

一起beloning如果有兩個以上的每個用戶記錄和兩個記錄的ID被consequtive,那麼你就必須在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

+0

澄清我的問題,但我只得到一個表。爲什麼是A和B?我不明白。 (我在我的問題中添加了一條評論,以便更具體) – pierreaurelemartin

+0

'A'和'B'是別名(我現在分別將它們更改爲「U」,unit_price和「Q」分別表示數量)。只有一張桌子('桌子),但我用了兩次。一旦我給它起名字'U'並且一次'Q'。這使我可以把它們看作是兩張不同的表格。從'U'我只用單位價格記錄,從'Q'只記錄數量並由用戶加入。此查詢用作子查詢,因此位於括號()之間。它被用作一個具有兩列「unit_price」和「quantity」的新表格,並充當外部SELECT的源表。 –

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 Fiddle With Demo

+0

仍然得到兩個錯誤的答案... – pierreaurelemartin

+0

@pierreaurelemartin請參閱我的編輯 – Taryn

+0

工作太謝謝! – pierreaurelemartin