2017-03-17 8 views
0

내 현재 sae_table (id, cbid, description, value)은 그림과 같습니다.테이블에 대한 크로스 탭 기능에 값이 없습니다.

은 내가 피벗하려는, 그래서 다음과 같이 할 수 있습니다 : 나는 ID, 설명 및 값을 사용하여 교차 분석을하고 tryied 한

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 .... 

하지만, 모든 값 달 열 아래에만 표시됩니다.

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, 설명 및 값을 사용하여 단지 선회했습니다. 그러나 그것은 구별되는 단서만을 보여줍니다. 그리고이 경우 하나의 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하는 제 2 엔트리를 제거) 된 질의에 대한 결과 : 갱신

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'이어야합니까? (Btw, 텍스트로 데이터를 전달하고 이미지는 제공하지 않음). – 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 your_table'을 사용하여 예제 데이터 [hier] (http://rextester.com/l/postgresql_online_compiler)를 삽입하십시오. –