Sometimes, simpler is better. on 4/16/02 4:16 PM, Gurhan Ozen at [EMAIL PROTECTED] wrote:
select ad_pubid, client_region, count(distinct ad_clientid) as Advertisers from ads, clients where ads.ad_clientid = clients.client_id group by ad_pubid, client_region; I think I was too busy trying to make it come out pretty. My public thanks to Gurhan for the simple solution. -Kevin on 4/16/02 3:46 PM, Kevin Murphy at [EMAIL PROTECTED] wrote: > Hello. > > I have just spent the afternoon pouring over the mailing list archives and > the manual trying to find a way to do this, but have come up pretty empty, > so I decided it was time to ask the list. > > I have a database that our sales team uses to track their sales efforts. > For the sake of simplicity, and to make this problem easier to digest, it > can be described in two tables: > > ads = advertisements sold > +---------------+------------------+------+-----+---------+----------------+ > | Field | Type | Null | Key | Default | Extra | > +---------------+------------------+------+-----+---------+----------------+ > | ad_id | int(11) unsigned | | PRI | NULL | auto_increment | > | ad_clientid | int(8) | | | | | > | ad_pubid | int(8) | | | | | > +---------------+------------------+------+-----+---------+----------------+ > > clients = clients who have purchased ads > +---------------+------------------+------+-----+---------+----------------+ > | Field | Type | Null | Key | Default | Extra | > +---------------+------------------+------+-----+---------+----------------+ > | client_id | int(11) unsigned | | PRI | NULL | auto_increment | > | client_region | char(3) | | | 0 | | > +---------------+------------------+------+-----+---------+----------------+ > > > The easy part (what already works): > > We can generate a report that tells us how many ads were sold in each > publication, broken down by region. We can also make that same query tell > us the total number of advertisers in each publication (a single client can > purchase multiple ads in a single publication), like this: > > select > ad_pubid, > count(ad_pubid) as ads_sold, > count(distinct ad_clientid) as advertisers, > SUM(IF(client_region='DL',1,0)) as DL_ads_sold, > SUM(IF(client_region='GN',1,0)) as GN_ads_sold, > SUM(IF(client_region='LK',1,0)) as LK_ads_sold, > SUM(IF(client_region='ME',1,0)) as ME_ads_sold, > SUM(IF(client_region='MN',1,0)) as MN_ads_sold, > SUM(IF(client_region='SC',1,0)) as SC_ads_sold, > SUM(IF(client_region='SW',1,0)) as SW_ads_sold, > SUM(IF(client_region='WM',1,0)) as WM_ads_sold > from ads > inner join clients on ad_clientid = client_id > group by ad_pubid > > (the actual query and table structures are much more complex, and include > relationships to make the publication name visible, total prices and other > human-oriented stuff like that, but the above gets the point across) > > Problem: Our sales staff wants me to run this same report, but tell them how > many ADVERTISERS bought in each region, NOT the number of ADS SOLD in each > region. So, what I'd like to be able to do is to change the SUM lines to > read something like this (the following doesn't work ;): > > SUM(IF(client_region='GN' and distinct(client_id),1,0)) as GN_ads_sold, > > What I CAN do is query for each region, like this: > > select > ad_pubid, > count(distinct ad_clientid) as WM_Advertisers > from > ads > inner join clients on ad_clientid = client_id > where > client_region = 'WM' > group by > ad_pubid > > > But, as you can imagine, I don't WANT to do it that way, because it will > mean making EIGHT queries in order to get the numbers I need for a single > report. And I'm trying to get OUT of the > gotta-write-a-fancy-script-to-generate-this-report business, because it just > takes too darned long! > > Does anybody know of a way to do this in a single query? It just seems like > it should be SO possible! I did notice that COUNT(distinct expr) can take > multiple expressions, but the documentation is pretty thin in describing > 'how it works', so I'm not sure what to expect when giving it more than one > expression, or, for that matter, what to give it for expressions in the > first place! I've tried trial-and-error, and nothing seemed to be yielding > predictable results. > > So, I'm off to write a PHP script to generate this silly report. But if > someone comes up with a way to do it without a script, or has any > suggestions about how to do it better, I'm ALL EARS. > > Thanks! > > -Kevin -- Kevin Murphy Director of Technology Glen Group Marketing and Advertising Design P.O. Box 2838, 170 Kearsarge Street North Conway, New Hampshire 03860 http://www.glengroup.com Voice: 603-356-3030 | FAX: 603-356-3991 --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php