2016-03-01 81 views
0

長時間閱讀,第一次海報。本身與多個WHERE狀態一起加入表

我試圖鞏固一張桌子,我必須在運輸過程中丟失貨物的比率。在這張表中,我們有四種產品,三種原產國,三種過境國(貨物首先被運送到客戶之前先運到)以及三個目的地國。表格如下。

Status   Product Count Origin Transit  Destination 
-------------------------------------------------------------------- 
Delivered  Shoes  100  Germany France  USA 
Delivered  Books  50  Germany France  USA 
Delivered  Jackets 75  Germany France  USA 
Delivered  DVDS  30  Germany France  USA 
Not Delivered Shoes  7  Germany France  USA 
Not Delivered Books  3  Germany France  USA 
Not Delivered Jackets 5  Germany France  USA 
Not Delivered DVDS  1  Germany France  USA 
Delivered  Shoes  300  Poland Netherlands Canada 
Delivered  Books  80  Poland Netherlands Canada 
Delivered  Jackets 25  Poland Netherlands Canada 
Delivered  DVDS  90  Poland Netherlands Canada 
Not Delivered Shoes  17  Poland Netherlands Canada 
Not Delivered Books  13  Poland Netherlands Canada 
Not Delivered Jackets 1  Poland Netherlands Canada 
Delivered  Shoes  250  Spain  Ireland  UK 
Delivered  Books  20  Spain  Ireland  UK 
Delivered  Jackets 150  Spain  Ireland  UK 
Delivered  DVDS  60  Spain  Ireland  UK 
Not Delivered Shoes  19  Spain  Ireland  UK 
Not Delivered Books  8  Spain  Ireland  UK 
Not Delivered Jackets 8  Spain  Ireland  UK 
Not Delivered DVDS  10  Spain  Ireland  UK 

我想創建一個新表,顯示交付貨物的數量,並且不在一行中交付,就像這樣。

Product Delivered Not_Delivered Origin Transit  Destination 
Shoes  100   7    Germany France  USA 
Books  50   3    Germany France  USA 
Jackets 75   5    Germany France  USA 
DVDS  30   1    Germany France  USA 
Shoes  300   17    Poland Netherlands Canada 
Books  80   13    Poland Netherlands Canada 
Jackets 25   1    Poland Netherlands Canada 
DVDS  90   0    Poland Netherlands Canada 
Shoes  250   19    Spain  Ireland  UK 
Books  20   8    Spain  Ireland  UK 
Jackets 150   8    Spain  Ireland  UK 
DVDS  60   10    Spain  Ireland  UK 

我看了一些其他帖子,到目前爲止我還沒有找到我正在尋找什麼。也許這裏的問題是,代碼中會有多個WHERE語句,以確保我不會將所有鞋子組合在一起,並且融合所有國家/地區組織。

這是可能的SQL?

+0

重要的SO - 你可以'標記接受answer'通過使用在公佈答案的左邊打鉤,表決以下。看到http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要!另外一個好的做法是對答案進行投票。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。 –

回答

1

這樣的事情?

select 
product 
,sum(case when status = 'Delivered' then count else 0 end) as delivered 
,sum(case when status = 'Not Delivered' then count else 0 end) as not_delivered 
,origin 
,transit 
,destination 

from table 

group by 
product 
,origin 
,transit 
,destination 
0

這很容易;而不是每個產品,來源,過境,目的地和狀態一行,您只需要每個產品,來源,過境和目的地的一個結果行。所以按這四列進行分組並有條件地進行聚合:

select 
    product, origin, transit, destination, 
    sum(case when status = 'Delivered' then "count" else 0 end) as delivered, 
    sum(case when status = 'Not Delivered' then "count" else 0 end) as not_delivered 
from mytable 
group by product, origin, transit, destination; 

順便說一句:對列名使用關鍵字不是一個好主意。我使用雙引號來使用您的列count,這是標準的SQL,但我不知道它是否適用於Google BigQuery。也許它必須是"Count"而非"count"或一些完全人)

0
SELECT 
    product, origin, transit, destination, 
    SUM([count] * (status = 'Delivered')) AS delivered, 
    SUM([count] * (status = 'Not Delivered')) AS not_delivered 
FROM mytable 
GROUP BY 1, 2, 3, 4