2014-12-05 49 views
-1

我有一張存儲森林圖的測量值的表。該表具有以下標題:sql case在一列中返回多個未知字符串值

id, plot_id, date, plot_measurement_type_id, value_type_id, value_int, value_real, value_bool, value_char, measurement_units_id 

它的目的是要保留儘可能多的靈活性,可能的,因爲會有很多不同類型的情節,多年來測量的,想留住小桌子。

plot_measurement_type_id與不同類型的測量有關。在主要情況下,每個日期只有一個測量值。但是,當measurement_type_id = 5或6時,這是觀察結果,可能有很多。有沒有一種方法可以使用case語句(如下所示)並將所有觀察結果(例如所有5個)連接成一列。我的工作是使用max和min將觀察結果分解到單獨的表格中,但當有多個觀察結果時,這不起作用。

我打算創建一個視圖,以更可讀的格式爲用戶顯示數據...使用以下查詢。

select pl.plot_id, 
    max(case when pm.plot_measurement_type_id = 1 then value_real end) slope, 
    max(case when pm.plot_measurement_type_id = 2 and value_bool = TRUE then 'true' else 'false' end) burnt, 
    max(case when pm.plot_measurement_type_id = 3 then value_real end) estimated_tree_canopy, 
    max(case when pm.plot_measurement_type_id = 4 then value_real end) estimated_grass_cover, 
    max(case when pm.plot_measurement_type_id = 5 then value_char end) human_use, 
    min(case when pm.plot_measurement_type_id = 5 then value_char end) human_use2, 
    max(case when pm.plot_measurement_type_id = 6 then value_char end) observations, 
    max(case when pm.plot_measurement_type_id = 7 then value_char end) notes, 
    max(case when pm.plot_measurement_type_id = 9 then value_real end) wet_litter_weight, 
    max(case when pm.plot_measurement_type_id = 11 then value_real end) dry_litter_weight, 
    max(case when pm.plot_measurement_type_id = 10 then value_real end) wet_grass_weight, 
    max(case when pm.plot_measurement_type_id = 12 then value_real end) dry_grass_weight, 
    max(case when pm.plot_measurement_type_id = 13 then value_real end) altitude, 
    max(case when pm.plot_measurement_type_id = 14 then value_char end) lcc 
from forest.plots pl 
    inner join forest.plot_measurement pm on pm.plot_id = pl.plot_id 
group by pl.plot_id 
+1

:在Postgres的你可以使用string_agg()功能。你在這裏提出的是......可怕的(因爲缺乏一個更好的詞)並且不可能保持或正確使用(例如創建查詢來分析數據)。如果您確實打算「儘可能保持靈活性」,則應該創建一個適用於簡單查詢的數據模型,而不是使難看的查詢適合不可能的數據模型。對不起,不能再做更多... – Patrick 2014-12-05 14:58:09

+0

並提供一個小小的背景:我與森林信息系統公司合作多年,並且遇到了傳統數據庫,這些數據庫看起來像您提議的那樣詭異。這只是不好的做法。如果你喜歡你的森林,請拜託你的數據模型。 – Patrick 2014-12-05 15:00:36

+0

我正在使用我的前任的數據模型,並將盡其所能。感謝您的意見,所有相同的 – user3770062 2014-12-05 15:33:23

回答

1

是的。既然你可以使用** **關係數據庫管理系統,你是一個關係數據模型好得多工作

string_agg(case when pm.plot_measurement_type_id = 5 then value_char end, ', ') human_use2, 
+0

偉大的,那工作。謝謝 – user3770062 2014-12-05 15:39:30