Hi all,

'Scuse the long post :) I'm trying to include all relevant info..

I'm trying to work out a better way to approach a query, any tips are greatly appreciated.

The relevant tables:

db=# \d tp_conversions
                Table "public.tp_conversions"
    Column     |          Type          |     Modifiers
---------------+------------------------+--------------------
 conversionid  | integer                | not null default 0
 type          | character varying(10)  |
 name          | character varying(255) |
 amount        | double precision       |
 cookieid      | character varying(32)  |
 currtime      | integer                |
 ip            | character varying(20)  |
 origintype    | character varying(20)  |
 originfrom    | character varying(255) |
 origindetails | character varying(255) |
 userid        | integer                |
Indexes:
    "tp_conversions_pkey" primary key, btree (conversionid)
    "conv_origindetails" btree (origindetails)
    "conv_originfrom" btree (originfrom)
    "conv_origintype" btree (origintype)
    "conv_time" btree (currtime)
    "conv_userid" btree (userid)


trackpoint=# SELECT count(*) from tp_conversions; count ------- 261 (1 row)


db=# \d tp_search Table "public.tp_search" Column | Type | Modifiers ------------------+------------------------+-------------------- searchid | integer | not null default 0 searchenginename | character varying(255) | keywords | character varying(255) | currtime | integer | ip | character varying(20) | landingpage | character varying(255) | cookieid | character varying(32) | userid | integer | Indexes: "tp_search_pkey" primary key, btree (searchid) "search_cookieid" btree (cookieid) "search_keywords" btree (keywords) "search_searchenginename" btree (searchenginename) "search_userid" btree (userid)


trackpoint=# SELECT count(*) from tp_search; count ------- 5086 (1 row)



What I'm trying to do...

Work out the number of conversions for each search origin.


This query works:

select
count(distinct conversionid) as convcount,
count(distinct searchid) as searchcount,
(count(distinct conversionid) / count(distinct searchid)) as perc,
s.searchenginename
from tp_conversions c, tp_search s
where
c.origintype='search' and s.searchenginename=c.originfrom and s.userid=c.userid and c.userid=1
group by searchenginename
order by convcount desc;


 convcount | searchcount | perc | searchenginename
-----------+-------------+------+------------------
        15 |        2884 |    0 | Google
         1 |         110 |    0 | Google AU
         2 |         308 |    0 | Google CA
         1 |          25 |    0 | Google CL
         1 |         143 |    0 | Google DE
         1 |         117 |    0 | Google IN
         1 |          26 |    0 | Google NZ
         3 |          49 |    0 | Google RO
         1 |          60 |    0 | Google TH
         2 |         174 |    0 | Yahoo
(10 rows)


However the percentage is wrong.

I can cast one to a float:

(count(distinct conversionid) / count(distinct searchid)::float)

and it'll give me a better percentage:

 convcount | searchcount |        perc         | searchenginename
-----------+-------------+---------------------+------------------
        15 |        2884 | 0.00520110957004161 | Google
         3 |          49 |  0.0612244897959184 | Google RO
         2 |         308 | 0.00649350649350649 | Google CA
         2 |         174 |  0.0114942528735632 | Yahoo
         1 |         110 | 0.00909090909090909 | Google AU
         1 |          25 |                0.04 | Google CL
         1 |         143 | 0.00699300699300699 | Google DE
         1 |         117 | 0.00854700854700855 | Google IN
         1 |          26 |  0.0384615384615385 | Google NZ
         1 |          60 |  0.0166666666666667 | Google TH
(10 rows)

(I think the answer to this is 'no' but I'm going to ask anyway :P)
Is there an easier way to get the more-detailed percentage (it's meant to work in multiple databases - so casting to a float won't work for other db's) ?



More importantly... Is there a better way to write the query (I don't like the count(distinct...) but it works and gives the right info) ?


I tried to do it with a union:

SELECT
count(searchid),
searchenginename
from tp_search s
where userid=1
group by searchenginename
union
select
count(conversionid),
originfrom
from tp_conversions c
where c.userid=1
group by originfrom;

but then realised that getting the data out with php would be a nightmare (plus I can't get the percentages).

Lastly:

db=# SELECT version();
                            version
---------------------------------------------------------------
 PostgreSQL 7.4.3 on i386-pc-linux-gnu, compiled by GCC 2.95.4
(1 row)

(I know it's a little out of date, upgrading later this week).

Any suggestions/hints/tips welcome :)

Thanks,
Chris.

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to