2017-09-01 62 views
0

我正在查詢的圈子中,並將非常感謝您的幫助,因爲我對此很感興趣。我使用postgre SQL版本:9.5.8選擇所選的2列是來自表格的1列,但條件不同

我想要做的事:

我想在整個銷售工作出部分銷售額的百分比。

我徹底搞亂了的部分是最後的選擇,在這裏我從表中「買賣」選擇同一列COUNT(sale_id)的兩倍,但通過2種不同的條件下通過COUNT(sale_id)(一用一'WHERE'和一個沒有)創建2個新列。我是否需要將它們作爲單獨的表格來加入?

理想的結果應該是一個百分比。

這是我(但我當然得到一堆錯誤):

SELECT ROUND(percentage_partial_sale, 1) as "percentage_partial" 
FROM (
SELECT count_partial_sale/count_all_sales as percentage_partial_sale 
FROM (
SELECT COUNT(sale_id) FROM sale WHERE sale.is_partial=true as "count_partial_sale", 
COUNT(sale_id) FROM sale as "total_sellouts"); 

如果你能表達通俗地說的解決方案,將是有益的。隨意根據需要進行更改。

非常感謝您的幫助。

回答

1

使用CASE WHEN有條件數:

select 
    count(*) as all_sales, 
    count(case when is_partial then 1 end) as partial_sales, 
    count(case when is_partial then 1 end)::decimal/count(*)::decimal * 100.0 as ratio 
from sale; 
+1

這是有效的,因爲默認情況下,當沒有條件滿足時,CASE表達式的值爲NULL,COUNT()聚合函數不計算NULL值。 –

+0

@Bacon位:正確。感謝您添加此解釋。 –

+0

謝謝@ThorstenKettner!現在我得到這個(這是更接近我想要的): '所有銷售的部分銷售比例 316 203 0' 似乎有在列3 快速的百分比計算一個小問題但計算結果顯示第1列和第2列的計數是正確的! @BaconBits,謝謝有用的解釋。 – ElNuni

0

你可以簡單地計算出的is_partial鑄造到integer平均值(假爲0,真爲1):

[local] #= CREATE TABLE sale (is_partial boolean); 
CREATE TABLE 

[local] #= INSERT INTO sale VALUES (false), (false), (true); 
INSERT 0 3 

[local] #= SELECT AVG(is_partial::int) FROM sale; 
┌────────────────────────┐ 
│   avg   │ 
├────────────────────────┤ 
│ 0.33333333333333333333 │ 
└────────────────────────┘ 
(1 row) 

Time: 6,012 ms 

如果您的用例不能使用AVG完成,您可以使用FILTER從集合函數中刪除行:

[local] #= SELECT COUNT(*) FILTER (WHERE is_partial)/COUNT(*) :: float 
      FROM sale; 
┌───────────────────┐ 
│  ?column?  │ 
├───────────────────┤ 
│ 0.333333333333333 │ 
└───────────────────┘ 
(1 row) 
相關問題