2011-09-27 200 views
1

通過類似標題的問題來看,但沒有一個完全覆蓋了我的問題。我有一個看起來像這樣的查詢。SUM子查詢?

SELECT 
     bus_products.id 
     , bus_products.prod_name 
     , (
     SELECT SUM(bus_warehouse_entries.quantity) * bus_products.weight 
     FROM bus_warehouse_entries 
     WHERE bus_warehouse_entries.org_product_code = bus_products.prod_code 
     AND bus_warehouse_entries.type = 0 
     AND bus_warehouse_entries.request_date >= 'some_date_here' 
    ) AS reg_yr 
    FROM 
     bus_products 
    WHERE 1'some_search_params' 
    GROUP BY bus_products.prod_name 
    ORDER BY 'some_sort' 

雖然我按產品名稱分組,但子查詢通過匹配產品代碼進行選擇。多個產品代碼可能具有相同的產品名稱。如果有多個具有相同名稱的代碼,則上述查詢僅捕獲歸因於第一個代碼的數量。

我想在子查詢周圍添加一個SUM(),以獲得具有該特定產品名稱的所有產品代碼的總數,但這會在子查詢SELECT的開始處導致語法錯誤。有關如何以另一種方式完成此任務的建議?

爲簡化起見,表是這個樣子

bus_products 
id | prod_code | prod_name | weight 

bus_warehouse_entries 
org_product_code | quantity | type | request_date 
+0

會有其他子查詢與其他where子句添加一次我把這部分了。 – dqhendricks

+0

我試過這個查詢,它在這裏工作,只是改變了地方和排序是有效的。 –

+0

@SérgioMichels可以使用什麼數據?正如我在問題中所述,上述查詢將只抓取具有特定產品名稱的第一個產品代碼的總數......並且在子查詢周圍添加sum()會導致語法錯誤。 – dqhendricks

回答

5
SELECT x.prod_name 
    , SUM(x.total) 
    FROM (SELECT bp.prod_name 
       , (SELECT SUM(wh.quantity) * bp.weight 
        FROM bus_warehouse_entries wh 
        WHERE bp.prod_code = wh.org_product_code) AS total 
     FROM bus_products bp) x 
GROUP BY x.prod_name 

您可以在選擇內從添加更多的子查詢和外部查詢它們求和。

0

嘗試在另一個查詢包裹了整個事情。

SELECT id, prod_name, sum(reg_yr) 
FROM (your query) 
GROUP BY id, prod_name 
+0

不能完全做到這一點,因爲當我完成時,其他子查詢將會有其他列。 – dqhendricks

1

試試這個:

select b.id, b.prod_name, sum(bwe.quantity)*b.weight as reg_yr 
from bus_products b inner join 
bus_warehouse_entries bwe on bwe.org_product_code=b.prod_code 
where bwe.type=0 and bwe.request_date>='some date' 
group by b.id,b.prod_name, b.weight 

UPDATE:這個怎麼樣呢?

SELECT 
     bus_products.id 
     , bus_products.prod_name 
     , f.part_total 
    FROM 
     bus_products bus_products 
     inner join (
     SELECT SUM(bus_warehouse_entries.quantity) * bus_products.weight as part_total 
     ,bus_products.prod_code as p_code 
     FROM bus_warehouse_entries bus_warehouse_entries join bus_products 
     on bus_products.prod_code=bus_warehouse_entries.org_product_code 
     WHERE bus_warehouse_entries.type = 0 
     AND bus_warehouse_entries.request_date >= 'some_date' 
     group by bus_products.prod_code,bus_products.weight 
    ) f on f.p_code=bus_products.prod_code 
+0

不能完全做到這一點,因爲當我完成時,會有其他子查詢的其他列與不同的where子句。 – dqhendricks

+0

@dqhendricks檢查我的更新。這應該做到這一點。我在Sql Server中測試過,但它應該在MySql上工作。 – Icarus

+0

有趣。我將在明天仔細研究這一點,並讓你知道結果如何。 – dqhendricks

0

,以幫助支持我的答案,並在問題您的意見,這聽起來像你想的產品名稱,而不是ID ...例如:你可以有20個產品是所有電視在產品的名稱實際上聽起來像是一個類別與特定的產品名稱。每個「產品名稱」都會有更具體的「內容」。因此,您需要加入ID的唯一原因是獲得與倉庫庫存相關的適當權重。這就是說,我會嘗試這個...

select 
     bp.prod_name, 
     sum(wh.quantity * bp.weight) as TotalWeight 
    from 
     bus_warehouse_entries wh 
     join bus_products bp 
      on wh.org_product_code = bp.prod_code 
    where 
      wh.type = 0 
     and wh.request_date >= 'some_date' 
     and (any other criteria) 
    group by 
     bp.prod_name 
    order by 
     bp.prod_name (or whatever else) 
+0

有趣的是,但正如我所說,當我完成時,會有其他子查詢與其他子句。例如,我還需要查詢的第四列中的類型爲1的條目的總數。 – dqhendricks