2016-03-16 81 views
0

我有兩張表;其中包含了產品的統計數據,另一個包含附加統計MySQL加入sum()

StatsHourly:

id 
product_id (can be multiple) 
amount 
cost 
time 

StatsValues:

id 
product_id (can be multiple) 
value (double) 

我需要加入這兩個表,得到這樣的結果:

product_id 
sum (amount) 
sum (cost) 
sum (value) 

我正在嘗試這樣做:

"SELECT 
    SUM(s.amount) as amount, 
    SUM(s.cost) as cost 

FROM StatsHourly s 
LEFT JOIN (
    SELECT 
    COALESCE(SUM(value), 0) as value 
    FROM StatsValues 
    GROUP BY product_id 
) value v ON v.product_id = s.product_id 
WHERE 1 
    AND s.product_id = :product_id"; 

這不起作用。有人能告訴我正確的做法嗎?

+1

你能描述多一點什麼「不工作」的意思,正是? – Castaglia

+0

它只是告訴我,我有mySQL錯誤,我看不到一個;對於我來說這個查詢有點太過分了,老實說 –

+0

SUM(s.cost)作爲成本, - 因爲成本是正確的,逗號是錯誤的SUM(s.cost)。最後一個字段後面沒有逗號 –

回答

1
  • 你有一個額外的逗號as cost後:

    SUM(s.cost) as cost, <-- here

  • 您也可以使用2別名的子查詢,你應該從那裏取出值:

    ) value v

  • 您不使用子查詢的任何輸出。

  • Coalesce()在子查詢中是不必要的。

-1

此作品(測試):

SELECT 
s.product_id as product_id, 
s.amount_s as amount, 
s.cost_s as cost, 
v.value_v as value 
FROM 
(SELECT 
    product_id, 
    SUM(amount) as amount_s, 
    SUM(cost) as cost_s 
    FROM StatsHourly 
    GROUP BY product_id) as s 
LEFT JOIN 
(SELECT 
    product_id, 
    SUM(value) as value_v 
    FROM StatsValues 
    GROUP BY product_id) as v 
ON v.product_id = s.product_id; 
WHERE s.product_id = 'product_id'; 

的一點是:

  • 當你有你必須通過查詢,以便使兩個聚合表都表多項相等PRODUCT_ID,使product_id唯一併對所有適當的行進行求和。
  • 之後,您可以加入並選擇已經彙總的值。

問候

+0

如果每個表中有兩個記錄具有相同的產品ID,那麼通過加入它們,您將在輸出中獲得2×2條記錄,並且按功能分組將對此膨脹結果集進行操作。 '1和...'是一個超級但合法的條件。 – Shadow

+0

@Shadow - 右:WHERE 1是超級的,不是錯誤。關於子查詢你也是對的,但你需要做一個雙重子查詢然後加入。只有一個子查詢會得到充足的值(聚合值行將與第一個表的行相乘)。然後使用匯總表的值進行聯接。看到我更新的答案。謝謝 –

+0

2個子查詢是超級的,你只需要一個在OP中寫的。 – Shadow