I think what you are talking about could be called a 'crosstabulation' or
a crosstab. 

Their are some tutorials about making cross-tabs using perl. I have used
them a lot, and they are really great.

I tend to stack up lots of IF statemens...

Table1

month   person  sex     sales
1       a       m       10      
1       b       f       20
1       c       m       30
2       a       m       40
2       b       f       50
2       c       m       60


select 
  month,
  sum(if(sex='m',sales,0)) as male_sales,
  sum(if(sex='f',sales,0)) as female_sales,
  sum(sales) as total
from 
  Table1
group by
  month;

This would give (I think)...

month   male_sales      female_sales    total
1       40              20              60
2       100             50              150

You could easily add a...

count(distinct(if(sex='m',person,NULL))) as total_men,
count(distinct(if(sex='f',person,NULL))) as total_women,

to create average sales for men and women, or anything else you want.

Does that look right?


On Fri, 8 Apr 2005, Jacob, Raymond A Jr wrote:

>Question: I frequently would like to summarize the results of my query in 
>heiarchical layout also
>known as a Pivot table.
>Here is an example of what I would like output. NULL will be printed as a 
>space 
>when output.
>
>sum of broken| source of  | qty      |reseller of |qty      |customer with 
>|qty by
>  bolts      |broken bolts|regional  |broken bolts|reseller |broken bolts  
> |customer
>-----------------------------------------------------------------------------
> 100         |  NULL      |NULL      |NULL        | NULL    |NULL          
> |NULL
>(100/NULL)   |  US        | 75       |NULL        | NULL    |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |ACME        | 35      |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |(ACME/NULL) |(35/NULL)|Barney Rubble |20
>(100/NULL)   |  US        | 75       |NULL        | NULL    |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |ACME        | 35      |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |(ACME/NULL) |(35/NULL)|Betty Rubble  |5
>(100/NULL)   |  US        | 75       |NULL        | NULL    |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |ABLE        | 25      |NULL          
>|NULL
>(100/NULL)   | (US/NULL)  |(75/NULL) |(ABLE/NULL) |(25/NULL)|Sponge Bobble |20
>(100/NULL)   |  MEXICO    | 15       |NULL        | NULL    |NULL          
>|NULL
>(100/NULL)   | (MEX/NULL) |(15/NULL) |TIPPY       | 12      |NULL          
>|NULL
>(100/NULL)   | (MEX/NULL) |(15/NULL) |(ACME/NULL) |(12/NULL)|Juan Pepe     |7
>
>
>100  *  *  *   *   *             *
>*   US  75 *   *   *             *
>*   *   * ACME 35  *             *
>*   *   *  *   *   Barney Ruble 20
>
>Where * represents NULL or a Primary Key.
>
>How does one build a pivot table?
>from tables such as:
>
>factory_parts table
> ::{
>part no, 
>plant, 
>qty_manufactured
>plant name
>}
>reseller_parts table
> ::{
>part no
>plant 
>qty received
>cost
>reseller name
>reseller id
>
>}
>customer_parts table
> ::{
>reseller id
>part no
>plant
>qty sold
>qty recvd
>customer id
>customer name
>}
>
>Ooops now the light bulb comes on 
>I would do:
>   select factory_parts.plant name, 
>          reseller_parts.reseller_name
>          customer_parts.customer_name,
>          customer_parts.qty_recvd
>   from factory_parts,reseller_parts,customer_parts
>   where customer_parts.part_no == 'broken_bolt' AND
>         ( customer_parts.part_no == reseller_parts.part.no AND
>           customer_parts.part_no == factory_parts.part.no )
>
>Now the question becomes how does one construct the aggregate columns
>representing the sum of bolts produced by the company,made at the plant,
>shipped to the reseller and sold to the customer,
>then join those aggregate columns? Any suggestions?
>
>Thank you,
>Raymond
>
>
>
>


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to