Hi,
Jay Blanchard wrote:
>Howdy,
>
>I need to write some data out to Excel spreadsheets for some of our managers
>to muddle with for projections. The query works fine...
>
>SELECT RecordID, RecordDate, count(*) AS Quantity
>FROM tblFOO
>Group By RecordID, RecordDate
>
>It returns;
>+----------+------------+----------+
>| RecordID | RecordDate | Quantity |
>+----------+------------+----------+
>| 100101 | 2002-03-21 | 6675 |
>| 100101 | 2002-03-22 | 6794 |
>| 100101 | 2002-03-23 | 2916 |
>| 100101 | 2002-03-24 | 1215 |
>| 100101 | 2002-03-25 | 6152 |
>| 100101 | 2002-03-26 | 5398 |
>+----------+------------+----------+
>
>as expected (Only a subset here, there are hundreds of rows). I want to
>place this data like this in an Excel table (bad ascii art example to
>follow);
>
>+------------+--------+--------+--------+
>| RecordID | 100101 | 100120 | 100131 |
>+------------+--------+--------+--------+
>| Date | | | |
>+------------+--------+--------+--------+
>| 2002-03-01 | | 12 | 130101 |
>+------------+--------+--------+--------+
>| 2002-03-21 | 6675 | | 1113 |
>+------------+--------+--------+--------+
>| 2002-03-22 | 6794 | 287 | 29045 |
>+------------+--------+--------+--------+
>| 2002-03-23 | 2916 | 6 | 233427 |
>+------------+--------+--------+--------+
>
>RecordID along the top row, dates down the side, quantities at the
>intersection that they belong. I could get an OBDC connection from Excel to
>MySQL and then write a complicated macro to do this, or if posssible (which
>is what I am really looking for) I would like to SELECT..INTO..OUTFILE an
>Excel file with the proper formatting.
>
>Any suggestions?
>
>Thanks!
>
>Jay Blanchard
>
here is a common way to do this staying within SQL. But it works only if
yuo know possible RecordID values in adnavce. i.e. for "general case"
you will need some scripting/programming to construct queres on the fly:
I will rewrite your table a little to give you a simplest example:
CREATE TABLE `foo` (
`r_id` enum('1','2','3','4','5') default NULL,
`d` date default NULL
)
Insert some 'foo' info
mysql> select * from foo order by r_id, d;
+------+------------+
| r_id | d |
+------+------------+
| 1 | 2002-04-30 |
| 1 | 2002-05-01 |
| 1 | 2002-05-02 |
| 2 | 2002-04-30 |
| 2 | 2002-04-30 |
| 2 | 2002-04-30 |
| 2 | 2002-05-01 |
| 2 | 2002-05-02 |
| 3 | 2002-04-30 |
| 4 | 2002-04-30 |
| 4 | 2002-05-01 |
| 5 | 2002-05-01 |
| 5 | 2002-05-01 |
+------+------------+
Here is same query as yours but with little addition :):
mysql> select d, r_id, count(*) as q_count, sum(1) as q_sum from foo
group by d, r_id;
+------------+------+---------+-------+
| d | r_id | q_count | q_sum |
+------------+------+---------+-------+
| 2002-04-30 | 1 | 1 | 1 |
| 2002-04-30 | 2 | 3 | 3 |
| 2002-04-30 | 3 | 1 | 1 |
| 2002-04-30 | 4 | 1 | 1 |
| 2002-05-01 | 1 | 1 | 1 |
| 2002-05-01 | 2 | 1 | 1 |
| 2002-05-01 | 4 | 1 | 1 |
| 2002-05-01 | 5 | 2 | 2 |
| 2002-05-02 | 1 | 1 | 1 |
| 2002-05-02 | 2 | 1 | 1 |
+------------+------+---------+-------+
Note that columns q_count and q_sum contain same value. Do you see why
both are correct?
Let's use that fact and add if() in sum()
mysql> select d, r_id, sum(1) as q_total, if(r_id = 1, 1, 0) as q_id1
from foo group by d, r_id;
+------------+------+---------+-------+
| d | r_id | q_total | q_id1 |
+------------+------+---------+-------+
| 2002-04-30 | 1 | 1 | 1 |
| 2002-04-30 | 2 | 3 | 0 |
| 2002-04-30 | 3 | 1 | 0 |
| 2002-04-30 | 4 | 1 | 0 |
| 2002-05-01 | 1 | 1 | 1 |
| 2002-05-01 | 2 | 1 | 0 |
| 2002-05-01 | 4 | 1 | 0 |
| 2002-05-01 | 5 | 2 | 0 |
| 2002-05-02 | 1 | 1 | 1 |
| 2002-05-02 | 2 | 1 | 0 |
+------------+------+---------+-------+
This is whole magic :)
We know in advance there are 5 different ids so add some if's ...
mysql> select d, r_id, sum(if(r_id = 1, 1, 0)) as q_id1, sum(if(r_id =
2, 1, 0)) as q_id2, sum(if(r_id = 3, 1, 0)) as q_id3, sum(if(r_id = 4,
1, 0)) as q_id4, sum(if(r_id = 5, 1, 0)) as q_id5, count(*) as q_total
from foo group by d, r_id;
+------------+------+-------+-------+-------+-------+-------+---------+
| d | r_id | q_id1 | q_id2 | q_id3 | q_id4 | q_id5 | q_total |
+------------+------+-------+-------+-------+-------+-------+---------+
| 2002-04-30 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
| 2002-04-30 | 2 | 0 | 3 | 0 | 0 | 0 | 3 |
| 2002-04-30 | 3 | 0 | 0 | 1 | 0 | 0 | 1 |
| 2002-04-30 | 4 | 0 | 0 | 0 | 1 | 0 | 1 |
| 2002-05-01 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
| 2002-05-01 | 2 | 0 | 1 | 0 | 0 | 0 | 1 |
| 2002-05-01 | 4 | 0 | 0 | 0 | 1 | 0 | 1 |
| 2002-05-01 | 5 | 0 | 0 | 0 | 0 | 2 | 2 |
| 2002-05-02 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
| 2002-05-02 | 2 | 0 | 1 | 0 | 0 | 0 | 1 |
+------------+------+-------+-------+-------+-------+-------+---------+
10 rows in set (0.00 sec)
Well w have redundant rows now - r_id is presented both as a column and
a row - let's get rid of it remove from group by.
I left it just to see result is correct
Here is your final 'Magic query'
mysql> select d, sum(if(r_id = 1, 1, 0)) as q_id1, sum(if(r_id = 2, 1,
0)) as q_id2, sum(if(r_id = 3, 1, 0)) as q_id3, sum(if(r_id = 4, 1, 0))
as q_id4, sum(if(r_id = 5, 1, 0)) as q_id5, count(*) as q_total from
foo group by d;
+------------+-------+-------+-------+-------+-------+---------+
| d | q_id1 | q_id2 | q_id3 | q_id4 | q_id5 | q_total |
+------------+-------+-------+-------+-------+-------+---------+
| 2002-04-30 | 1 | 3 | 1 | 1 | 0 | 6 |
| 2002-05-01 | 1 | 1 | 0 | 1 | 2 | 5 |
| 2002-05-02 | 1 | 1 | 0 | 0 | 0 | 2 |
+------------+-------+-------+-------+-------+-------+---------+
3 rows in set (0.00 sec)
Are you satisfied? :)
Detailed analisys of this technique can be found in a great (MUST read)
article at:
http://www.mysql.com/articles/wizard/index.html
http://www.devshed.com/Server_Side/MySQL/MySQLWiz/page1.html
--
Best regards
--
For technical support contracts, visit https://order.mysql.com/
__ ___ ___ ____ __
/ |/ /_ __/ __/ __ \/ / Mr. Alexander Keremidarski <[EMAIL PROTECTED]>
/ /|_/ / // /\ \/ /_/ / /__ MySQL AB, Full-Time Developer
/_/ /_/\_, /___/\___\_\___/ Sofia, Bulgaria
<___/ www.mysql.com M: +359 88 231668
---------------------------------------------------------------------
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