Thread: SQL (table transposition)
Is there any way to get table T3 (below) from T1 and T2 using SQL (select, view, etc)? T3 is basically all INDEX values from T1 matched to IND from T2 with the corresponding KEY/VALUE pairs transposed from rowsto columns. ------- |INDEX| (T1) ------- | 1 | | 2 | | 3 | ------- ----------------- |IND|KEY| VALUE | (T2) ----------------- | 1 | 1 | val_a | | 1 | 2 | val_b | | 1 | 3 | val_c | | 2 | 1 | val_d | | 2 | 2 | val_e | | 3 | 1 | val_f | | 3 | 3 | val_g | ----------------- ---------------------------------- |T1_INDEX|KEY1VAL|KEY2VAL|KEY3VAL| (T3) ---------------------------------- | 1 | val_a | val_b | val_c | | 2 | val_d | val_e | | | 3 | val_f | | val_g | ---------------------------------- Thanks for any suggestions med vänlig hälsning /Dana
Hope you like black magic :) SELECT IND AS T1_INDEX, MIN(CASE WHEN KEY=1 THEN VALUE ELSE NULL END) AS KEY1VAL, MIN(CASE WHEN KEY=2 THEN VALUE ELSE NULL END) AS KEY2VAL, MIN(CASE WHEN KEY=3 THEN VALUE ELSE NULL END) AS KEY3VAL FROM T2 GROUP BY IND ORDER BY IND; Mark Dana.Reed@clinicaldatacare.com wrote: > > Is there any way to get table T3 (below) from T1 and T2 using SQL (select, view, etc)? > > T3 is basically all INDEX values from T1 matched to IND from T2 with the corresponding KEY/VALUE pairs transposed fromrows to columns. > > ------- > |INDEX| (T1) > ------- > | 1 | > | 2 | > | 3 | > ------- > > ----------------- > |IND|KEY| VALUE | (T2) > ----------------- > | 1 | 1 | val_a | > | 1 | 2 | val_b | > | 1 | 3 | val_c | > | 2 | 1 | val_d | > | 2 | 2 | val_e | > | 3 | 1 | val_f | > | 3 | 3 | val_g | > ----------------- > > ---------------------------------- > |T1_INDEX|KEY1VAL|KEY2VAL|KEY3VAL| (T3) > ---------------------------------- > | 1 | val_a | val_b | val_c | > | 2 | val_d | val_e | | > | 3 | val_f | | val_g | > ---------------------------------- > > Thanks for any suggestions > > med vänlig hälsning > /Dana
Dana.Reed@clinicaldatacare.com wrote: > > Is there any way to get table T3 (below) from T1 and T2 using SQL (select, view, etc)? > > T3 is basically all INDEX values from T1 matched to IND from T2 with the corresponding KEY/VALUE pairs transposed fromrows to columns. > > ------- > |INDEX| (T1) > ------- > | 1 | > | 2 | > | 3 | > ------- > > ----------------- > |IND|KEY| VALUE | (T2) > ----------------- > | 1 | 1 | val_a | > | 1 | 2 | val_b | > | 1 | 3 | val_c | > | 2 | 1 | val_d | > | 2 | 2 | val_e | > | 3 | 1 | val_f | > | 3 | 3 | val_g | > ----------------- > > ---------------------------------- > |T1_INDEX|KEY1VAL|KEY2VAL|KEY3VAL| (T3) > ---------------------------------- > | 1 | val_a | val_b | val_c | > | 2 | val_d | val_e | | > | 3 | val_f | | val_g | > ---------------------------------- > I think what you are looking for is cross tabulation, TRANSFORM statement, but I don't know if that is supported by PostgreSQL. Volker Paul
Hi, When I saw cross tab, I realized that I'd done this before. If you know what your keys are ahead of time, you can write the query. Otherwise, you can write a program go generate the query by looking at the distinct list of keys and generating code as follows. The code generator would only have to replace the ?'s in "SUM(CASE KEY WHEN ? THEN VALUE ELSE 0 END) AS KEY?VAL". SELECT INDEX AS T1_INDEX, SUM(CASE KEY WHEN 1 THEN VALUE ELSE 0 END) AS KEY1VAL, SUM(CASE KEY WHEN 2 THEN VALUE ELSE 0 END) AS KEY2VAL, SUM(CASE KEY WHEN 3 THEN VALUE ELSE 0 END) AS KEY3VAL FROM T1, T2 WHERE T1.INDEX = T2.IND GROUP BY T1.INDEX ; Henry -----Original Message----- From: Volker Paul [mailto:vpaul@dohle.com] Sent: Friday, August 04, 2000 2:30 AM To: Dana.Reed@clinicaldatacare.com Cc: pgsql-sql@postgresql.org Subject: Re: [SQL] SQL (table transposition) Dana.Reed@clinicaldatacare.com wrote: > > Is there any way to get table T3 (below) from T1 and T2 using SQL (select, view, etc)? > > T3 is basically all INDEX values from T1 matched to IND from T2 with the corresponding KEY/VALUE pairs transposed from rows to columns. > > ------- > |INDEX| (T1) > ------- > | 1 | > | 2 | > | 3 | > ------- > > ----------------- > |IND|KEY| VALUE | (T2) > ----------------- > | 1 | 1 | val_a | > | 1 | 2 | val_b | > | 1 | 3 | val_c | > | 2 | 1 | val_d | > | 2 | 2 | val_e | > | 3 | 1 | val_f | > | 3 | 3 | val_g | > ----------------- > > ---------------------------------- > |T1_INDEX|KEY1VAL|KEY2VAL|KEY3VAL| (T3) > ---------------------------------- > | 1 | val_a | val_b | val_c | > | 2 | val_d | val_e | | > | 3 | val_f | | val_g | > ---------------------------------- > I think what you are looking for is cross tabulation, TRANSFORM statement, but I don't know if that is supported by PostgreSQL. Volker Paul