2013-04-07 56 views
0

加入我有兩個表CLIENSTSPRICES我wanto加入他們的行列,以一年每一個來計算每個項目類型總價金額。
我的查詢必須對每個項目的值進行求和,按類型對它們進行分組,並且將它們與客戶表中對應項目的類型量進行比較;如果所選年份沒有項目,也會顯示空值。
MySQL的多與空的結果行

這裏我表:

CLIENTS 
| name | item_A | item_B | item_C | 
| X | 10 | 10 | 10 | 
| Y | 5 | 15 | 0 | 
| Z | 0 | 0 | 20 | 

PRICES 
| item | item_type | year | value | 
| a1 |  A  | 2010 | 1 | 
| a2 |  A  | 2010 | 2 | 
| b1 |  B  | 2010 | 2 | 
| b2 |  B  | 2010 | 3 | 
| c1 |  C  | 2010 | 3 | 
| a1 |  A  | 2011 | 4 | 
| b1 |  B  | 2011 | 5 | 

我正在尋找能夠執行每年相繼式結果的查詢選擇:

2010 
| name | price_A | price_B | price_C | 
| X | 30 | 60 | 30 | 
| Y | 15 | 90 |  0 | 
| Z |  0 |  0 | 60 | 

2011 
| name | price_A | price_B | price_C  | 
| X | 40 | 50 | none/null/zero | 
| Y | 20 | 75 | none/null/zero | 
| Z |  0 |  0 | none/null/zero | 

這是我的嘗試,但不幸的是它正確執行第一年(2010年),第二年(2011年)不返回任何一行。
我想這是由於第二年沒有total_C第三次加入。
如果結果存在
或者將值設置爲「none/null/zero」,請問mySQL加入tabe「」的正確方法是什麼?

SELECT 
`name`, 
`item_A` * `total_A`.`total_value` AS `price_A`, 
`item_B` * `total_B`.`total_value` AS `price_B`, 
`item_C` * `total_C`.`total_value` AS `price_C` 
FROM `CLIENTS` 
JOIN 
(
SELECT 
`item_type`, 
SUM(`value`) AS `total_value` 
FROM `PRICES` 
WHERE `item_type`='A' AND `year` LIKE '2010' 
GROUP BY `item_type` 
) AS `total_A` 
JOIN 
(
SELECT 
`item_type`, 
SUM(`value`) AS `total_value` 
FROM `PRICES` 
WHERE `item_type`='B' AND `year` LIKE '2010' 
GROUP BY `item_type` 
) AS `total_B` 
JOIN 
(
SELECT 
`item_type`, 
SUM(`value`) AS `total_value` 
FROM `PRICES` 
WHERE `item_type`='C' AND `year` LIKE '2010' 
GROUP BY `item_type` 
) AS `total_C` 

回答

2

如果我正確理解你的問題,我認爲你應該使用這樣的事情:

SELECT 
    s.year, 
    clients.name, 
    clients.item_A*s.sum_A, 
    clients.item_B*s.sum_B, 
    clients.item_C*s.sum_C 
FROM 
    clients INNER JOIN (
    SELECT 
    year, 
    SUM(CASE WHEN item_type='A' THEN value END) sum_A, 
    SUM(CASE WHEN item_type='B' THEN value END) sum_B, 
    SUM(CASE WHEN item_type='C' THEN value END) sum_C 
    FROM 
    prices 
    GROUP BY 
    year) s 
ORDER BY 
    s.year 

請參閱小提琴here

在子查詢上,我每年總結item_type的總值。然後,我正在與客戶表進行笛卡爾連接。

+0

是的!謝謝。這是一種不同的方法,你的聯合子查詢生成一個更大的表,其主對角線上的值不爲空,但所有的查詢都比我的更快,更小......廣告的作品! – Mave751 2013-04-07 12:26:07