Re: Crosstab function - Mailing list pgsql-general

From Hengky Liwandouw
Subject Re: Crosstab function
Date
Msg-id 004201cf68d4$152dc3f0$3f894bd0$@com
Whole thread Raw
In response to Re: Crosstab function  (David G Johnston <david.g.johnston@gmail.com>)
Responses Re: Crosstab function
Re: Crosstab function
List pgsql-general
Hi David,

Are you sure that there is no pure sql solution for this ?

I think (with my very limited postgres knowledge), function can solve this.

So far i can use command:

select *
from crosstab
(
  'select produkid, warehouseid, onhand
   from tblproduct order by 1',
  'select distinct warehouseid from tblproduct order by 1'
)
as ct (produkid text, office int, store2 int);

and I have this result :

   PRODUKID    | OFFICE | STORE2 |
---------------+--------+--------+
 2791404000014 |     10 |     45 |
 2791404000021 |        |     10 |

The problem is the column header is static. If I have new warehouse, I
should manually add it in the column header.

IF I use command : select 'Produk ID text, ' || array_to_string(array(select
warehousename from tblwarehouse), ' int, ') || ' int';

I can get : "Produk ID text, OFFICE int, STORE2 int"

Which is the column header I need but I really have no idea how to use this
as column header.

Anyway, If i can't do this in postgres, I will try to build sql string in
the client application (Windev) and send the fixed sql to the server

Thanks




-----Original Message-----
From: pgsql-general-owner@postgresql.org
[mailto:pgsql-general-owner@postgresql.org] On Behalf Of David G Johnston
Sent: Monday, May 05, 2014 10:25 PM
To: pgsql-general@postgresql.org
Subject: Re: [GENERAL] Crosstab function

Hengky Lie wrote
> The crosstab warehouse column name (OFFICE & Store2) is taken from
> tblwarehouse so when user add warehouse, crosstab column name will
> change automatically. And also each row has total qty.

In what programming language?  The only way to do this is to dynamically
construct the appropriate query, with the correct number of columns,
on-the-fly in the client application and send it as a normal query to the
server.  There is no pure SQL solution.

For the total column you will need a virtual warehouse that holds those
values.  Likely the easiest way to get that will be to UNION ALL the main
real warehouse query and another query the groups by product and sum-counts
that values from the individual warehouses.

IIRC you've already been shown how to write the basic crosstab query; this
really isn't any different but you will need procedural logic and some way
to dynamically build a SQL query string based upon how many warehouses you
have at the time you run the query.

I am assuming you know how to write the basic join query to get the general
form needed for the real warehouse data.

David J.





pgsql-general by date:

Previous
From: John R Pierce
Date:
Subject: Re: Monitoring Pg servers with Microsoft SCOM
Next
From: Paul Jungwirth
Date:
Subject: Re: Crosstab function