![](/img/trans.png)
[英]Postgres - Get sum of the values in a column on condition of another column
[英]Postgres: Get sum based on list in another column
我有一張桌子,位置如下:
地點 | 子位置 |
---|---|
一個 | A,a1,a2,a3 |
乙 | B,b1,b3 |
和另一張桌子,像這樣的時間
地點 | 小時 |
---|---|
一個 | 2 |
乙 | 3 |
一個 | 4 |
a1 | 1 |
a1 | 1 |
b3 | 8 |
對於每個位置,我需要獲取 sub_locations 的總小時數。
我正在尋找的結果是這樣的:
地點 | 子位置 | 全部小時數 |
---|---|---|
一個 | A,a1,a2,a3 | 8 |
乙 | B,b1,b3 | 11 |
我可以通過簡單的連接和按位置分組來簡單地獲得該位置的總和,但我需要的是所有子位置的總小時數。 我已經探索過對 total_hours 列使用另一個 select 語句,但結果為空。
select
l.location,
l.sub_locations,
sum(h.hours::float) as "sum plan hours for location"
from
locations l
join
hours h
on l.location = h.location
group by l.location,l.sub_locations
您可以將可怕的逗號分隔字符串轉換為數組並在 JOIN 條件中使用它:
select l.location, l.sub_locations, sum(h.hours)
from locations l
join hours h on h.location = any(string_to_array(l.sub_locations, ','))
group by l.location, l.sub_locations;
更好的解決方案是修復您的數據 model 並創建適當的一對多關系,該關系不會在 CSV 列中存儲位置/子位置。
我認為這將為您完成工作,或者如果不告訴我結果,那么我可以再次寫更多信息。
select
l.location,
l.sub_locations,
sum(h.hours::float) as "sum plan hours for location"
from
locations l
join
hours h
on l.location = h.location
WHERE h.location In (select sub_locations from locations where location = 'Your Location value(ex-A)')
group by l.location,l.sub_locations
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.