2017-03-17 56 views
0

的值我的当前sae_table(id,cbid,description,value)如图所示。表的交叉表功能没有携带沿着

我想转动它,所以它可以是这样的:

id  cbid month day year test actual_value normal_ran no 
1 60051  09  27 2016 "Urinary" "some vegetans" 
2 60051  09  30 2016 "Chest" 
3 60052 .... 

我已经tryied做用ID,说明和值交叉表,但所有的值只有每月栏下显示。

SELECT * FROM CROSSTAB('SELECT id, description,value from sae_test') 
AS ct ("id" integer, "Month" character varying(4000),"Day" character varying(4000),"Year" character varying (4000), 
"Test" character varying(4000),"Actual Value" character varying(4000),"Normal Range" character varying(4000),"No Test option" character varying(4000)); 

以上交叉结果(值不正确分配翻过列):

id Month Day Year  ... 
1  09      ... 
2  27      ... 
3  2016     ... 

我也尝试使用CBID,说明和值摆动而已。但它只显示独特的cbids。在这种情况下,一个cbid可以有多行。

SELECT * FROM CROSSTAB('SELECT * from sae_rel_data2()') 
AS ct ("CBID" character varying(4000), "Month" character varying(4000),"Day" character varying(4000),"Year" character varying (4000), 
"Test" character varying(4000),"Actual Value" character varying(4000),"Normal Range" character varying(4000),"No Test" character varying(4000)); 

用于查询上面(省去了相同的CBID第二条目,当那些条目应一直保持)其结果是:

cbid month day year ... 
60051 09  27  2016 ... 
60052       ... 
60053 09  27  2016 ... 
60029       ... 

enter image description here

更新:

如果我有可帮助识别CBID的第n个记录的序数,该怎么办?然后,我可以创建一个循环函数,它将为每个序号级别的cbid执行交叉表,然后将每个结合UNION或JOIN语句?这会起作用吗?如果是这样,该循环如何创建?我不熟悉它。

例子:

event_crf_id;  description,   value,  ordinal 
444;     "CBID";    "60051";   1 
444;     "Month";    "09";    1 
444;     "Day";    "27";    1 
444;     "Year";    "2016";   1 
444;     "Test";   "Urinary tract US";  1 
444;    "Actual Value"; "some vegetans lesions"; 1 
444;     "Normal Range";   "";    1 
444;    "No tests option";  "";    1 
444;     "Month";    "09";   2 
444;     "Day";     "30";   2 
444;     "Year";    "2016";   2 
444;     "Test";    "Chest/abdomen CT"; 2 
444;    "Actual Value";   "3 bladder lesions"; 2 
444;    "Normal Range";    "";   2 
444;    "No tests option";   "";   2 

喜欢的东西:

count=count (distinct ordinal) from sae_test() 
for each event_crf_id in (select * from sae_test() where ordinal=count) 
    SELECT * FROM CROSSTAB('SELECT event_crf_id, description, value from sae_test()) 
JOIN ... 
count=count+1 

有没有这种可能性?这个连接怎么执行?或者postgres自动知道,在循环中新条目将继续添加到表? (对不起,我对Postgres和数据库来说真的很陌生)

+0

您的数据不明确。行'60051'和列'Day'应该显示什么值?应该是“27”还是“30”? (顺便说一句,以文本形式提供数据,不提供图像)。 – klin

+0

应该有一个独特的值来确定哪个日期或测试或“实际值”是2. 3.或第n个60051的一部分?第二个问题:如果这些值以未排序的方式插入,如何分隔每个60051行组? –

+0

就这样想,60051代表一个病人,那个病人在不同的日期可以有多个实验室。这就是为什么你反复看到60051的原因。所以一个cbid可以有多个条目,但每个条目都有一个唯一的id。但是,为什么当我执行SELECT * FROM CROSSTAB('SELECT id,description,value from sae_test')时,所有数据都显示在第二列之下? –

回答

0

我从字面上不得不做这个艰难的,不成熟的方法。但它确实为我提供了我想要的结果。我如何以更复杂,更高效的方式来做到这一点?

Select a.event_crf_id, rel_test_CBID, a.row_number, a.rel_test_name, rel_test_actual_value, rel_test_month, rel_test_day, rel_test_year, rel_test_normal_range From (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_name 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Test') as a 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_actual_value 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Actual Value') as b 
on a.event_crf_id = b.event_crf_id and a.row_number = b.row_number 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_month 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Month') as c 
on a.event_crf_id = c.event_crf_id and a.row_number = c.row_number 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_day 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Day') as d 
on a.event_crf_id = d.event_crf_id and a.row_number = d.row_number 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_year 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Year') as e 
on a.event_crf_id = e.event_crf_id and a.row_number = e.row_number 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_normal_range 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and i.description = 'Normal Range') as f 
on a.event_crf_id = f.event_crf_id and a.row_number = f.row_number 

left join (Select id.event_crf_id, id.ordinal as row_number, id.value as rel_test_CBID 
from item i, item_data id 
where i.item_id=id.item_ID and id.item_id IN (2185,2262,2263,2264,2265,2266,2267,2268) and id.ordinal = 1 and i.description = 'CBID') as g 
on a.event_crf_id = g.event_crf_id 

order by a.event_crf_id, a.row_number asc; 
+0

用这两个表中的'insert into from yourtable'将您的示例数据[hier](http://rextester.com/l/postgresql_online_compiler)。 –