2011-12-05 42 views
1

我試圖加入兩個表(購買和購買屬性),然後根據連接進行分組,但是在連接期間生成NULL值,因爲並非表A中的每個條目都具有對應的「屬性'在表B - 這然後殺死我的'組'。分組存在NULL條目

我的實際執行情況比這更復雜,但這裏是什麼,我想實現一個修整的概念:

我有以下表格:

採購:

|purchase_id | products_id | qty | 
|  1  | 10  | 100 | 
|  2  | 11  | 100 | 
|  3  | 10  | 300 | 
|  4  | 12  | 50 | 

purchase_attributes :

|purchase_attributes_id | purchase_id | options_id | 
|   1    |  1  |  5  | 
|   2    |  3  |  5  | 
|   3    |  4  |  5  | 

現在,我的目標是c根據options_id來分組特定產品的總數。 所以,我有以下SQL:

select products_id, options_id, SUM(qty) 
from purchases 
left join purchase_attributes using(purchase_id) 
group by products_id, options_id 

這對於在purchase_id在purchase_attributes表中列出的所有的情況下,工作然而,對於purchase_id 2,它不會出現在purchase_attributes的情況下,它不顯示在我的結果集中。

示例結果集:

| products_id | options_id | SUM(qty) | 
|  10  |  5  | 400  | 
|  12  |  5  |  50  | 

不過,我想收到以下結果集:

| products_id | options_id | SUM(qty) | 
|  10  |  5  | 400  | 
|  11  |  NULL | 100  | 
|  12  |  5  |  50  | 

我已經嘗試了一些東西,包括集團內合併通過和聯盟(荷蘭國際集團)兩個選擇語句在一起,但我似乎無法得到正確的結果。

任何想法?提前致謝。

+0

可能'GROUP BY isnull(products_id,-1)'工作? –

+0

如果您在purchase.purchase_id = purchase_attributes.purchase_id上​​使用左連接purchase_attributes更改左連接,則可能會看到不同的結果。這是因爲新的連接語法與如何與空值形成比較有一些警告。如果您刪除了總和列,只進行了連接,您是否看到purchase_id = 2的空條目? – dash

回答

1

這個確實產生你想要的結果。

SELECT products_id,options_id,SUM(qty) 
FROM (SELECT 1 AS purchase_id,10 AS products_id,100 AS qty 
     UNION ALL 
     SELECT 2,11,100 
     UNION ALL 
     SELECT 3,10,300 
     UNION ALL 
     SELECT 4,12,50) purchases 
     LEFT JOIN (SELECT 1 AS purchase_attributes_id,1 AS purchase_id,5 AS 
         options_id 
        UNION ALL 
        SELECT 2,3,5 
        UNION ALL 
        SELECT 3,4,5) purchase_attributes USING(purchase_id) 
GROUP BY products_id,options_id 

請提供一個實際演示您的問題的示例。

+1

嗨馬丁。感謝您的回覆 - 我很抱歉,我沒有測試過我的「剝離」案例,我只是假設它會產生同樣的問題。不過,我現在發現,我的代碼的實際問題是,我也加入到一個選項表,它有多種語言的多個選項,因爲我做了'where options.languages_id ='1',我排除了所有該字段爲NULL的情況(無法完成聯接時產生)。 感謝您的幫助,您通過證明問題並不在於我相信它所做的事情,幫助我指出了正確的方向。 – user984976

0

注:我一直沒能嘗試這種代碼,只需鞭打它現在..所以,請測試它第一次..

SELECT p.products_id, pa.options_id 
     , SUM(qty) AS sum_qty 
    FROM purchases AS p 
    LEFT JOIN purchase_attributes AS pa 
    ON p.purchase_id = pa.purchase_id 
    GROUP BY p.products_id, pa.options_id 

讓我知道,如果它不工作,你得到了什麼結果..

0

道歉讀者,這是我的錯誤。我在問題(我認爲是錯誤的)中寫的答案實際上工作正常 - 在我的實際更復雜的語句中的一些其他代碼導致此問題失敗。

我很抱歉浪費任何人的時間與此。