2012-06-26 40 views
1

我有一个像使用MySQL功能格式化列名

select user, 
if(purchase_date='2012-06-10' - interval 1 day, revenue, 0), 
if(purchase_date='2012-06-10' - interval 2 day, revenue, 0), 
if(purchase_date='2012-06-10' - interval 3 day, revenue, 0) 
from purchases 
group by user; 

查询我想通过做这样的事情

select user, 
if(purchase_date='2012-06-10' - interval 1 day, revenue, 0) AS date_format('2012-06-10' - interval 1 day, '%M %D-%m') 
if(purchase_date='2012-06-10' - interval 2 day, revenue, 0) AS date_format('2012-06-10' - interval 2 day, '%M %D-%m')  
if(purchase_date='2012-06-10' - interval 3 day, revenue, 0) AS date_format('2012-06-10' - interval 3 day, '%M %D-%m') 
改变列的日期格式要像“周一6-10”

但是我得到一个SQL错误,说 错误1064(42000):您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以找到正确的语法以在...附近使用。'

是否可以这样做?

我想输出看起来像

user Mon 6-9 Sun 6-8 Sat 6-7 
---- ------- ------- ------- 
    1  23  34  65 
    4  26  21  65 
    11  21  65  0 
+1

减去日期的正确语法是DATE_SUB('2012-06-10',INTERVAL 1 DAY) – Kermit

+0

我可能是错的,但IF只能在程序中工作,您可能需要使用CASE。 – Kermit

+0

op需要格式化输出中的_column names_。我只是让调用脚本/软件处理,但。 – Wrikken

回答

2

你会相信我有办法解决吗?我真的不得不在我的想象中使用这个。我稍微改变了这个查询来每天执行一次SUM。请跟着:

你基本上需要从这个

select * from 
(select dt,DATE_FORMAT(dt,'%a %c-%e') dh FROM 
(select distinct purchase_date dt from purchases) dthdrs) DateHeaders; 

首先构建该查询

select user, 
SUM(if(purchase_date=DATE(NOW()) - interval 1 day, revenue, 0)) sum1, 
SUM(if(purchase_date=DATE(NOW()) - interval 2 day, revenue, 0)) sum2, 
SUM(if(purchase_date=DATE(NOW()) - interval 3 day, revenue, 0)) sum3 
from purchases 
GROUP BY user; 

,让我们做一些样本数据:

drop database if exists idris; 
create database idris; 
use idris 
create table purchases 
(
    id int not null auto_increment, 
    user int, 
    purchase_date date, 
    revenue int, 
    primary key (id) 
) ENGINE=MyISAM; 
create table dummydata like purchases; 
alter table dummydata drop column id; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set user=4; 
insert into purchases (user,purchase_date,revenue) select user,purchase_date,revenue from dummydata; 
delete from dummydata; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set user=11; 
insert into purchases (user,purchase_date,revenue) select user,purchase_date,revenue from dummydata; 
delete from dummydata; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set purchase_date = purchase_date - interval 1 day; 
insert into dummydata (purchase_date,revenue) values (date(now()),floor(rand() * 100)); 
update dummydata set user=1; 
insert into purchases (user,purchase_date,revenue) select user,purchase_date,revenue from dummydata; 
delete from dummydata; 
select * from purchases; 

运行之后,我做了这个数据:

mysql> select * from purchases; 
+----+------+---------------+---------+ 
| id | user | purchase_date | revenue | 
+----+------+---------------+---------+ 
| 1 | 4 | 2012-06-23 |  45 | 
| 2 | 4 | 2012-06-24 |  18 | 
| 3 | 4 | 2012-06-25 |  55 | 
| 4 | 4 | 2012-06-26 |  20 | 
| 5 | 11 | 2012-06-23 |  39 | 
| 6 | 11 | 2012-06-24 |  32 | 
| 7 | 11 | 2012-06-25 |  44 | 
| 8 | 11 | 2012-06-26 |  26 | 
| 9 | 1 | 2012-06-23 |  99 | 
| 10 | 1 | 2012-06-24 |  17 | 
| 11 | 1 | 2012-06-25 |  88 | 
| 12 | 1 | 2012-06-26 |  91 | 
+----+------+---------------+---------+ 
12 rows in set (0.00 sec) 

mysql> 

我们来运行我张贴

mysql> select user, 
    -> SUM(if(purchase_date=DATE(NOW()) - interval 1 day, revenue, 0)) sum1, 
    -> SUM(if(purchase_date=DATE(NOW()) - interval 2 day, revenue, 0)) sum2, 
    -> SUM(if(purchase_date=DATE(NOW()) - interval 3 day, revenue, 0)) sum3 
    -> from purchases 
    -> GROUP BY user; 
+------+------+------+------+ 
| user | sum1 | sum2 | sum3 | 
+------+------+------+------+ 
| 1 | 88 | 17 | 99 | 
| 4 | 55 | 18 | 45 | 
| 11 | 44 | 32 | 39 | 
+------+------+------+------+ 
3 rows in set (0.00 sec) 

mysql> 

这里第一个查询是我贴,将构建头

mysql> select * from 
    -> (select dt,DATE_FORMAT(dt,'%a %c-%e') dh FROM 
    -> (select distinct purchase_date dt from purchases) dthdrs) DateHeaders; 
+------------+----------+ 
| dt   | dh  | 
+------------+----------+ 
| 2012-06-23 | Sat 6-23 | 
| 2012-06-24 | Sun 6-24 | 
| 2012-06-25 | Mon 6-25 | 
| 2012-06-26 | Tue 6-26 | 
+------------+----------+ 
4 rows in set (0.00 sec) 

mysql> 

Now let's form VOLTRON

这里的第二个查询是两个查询相结合的形式您需要的标题:

mysql> select CONCAT('select user,',rv,' from purchases GROUP BY user') 
    -> INTO @voltron from 
    -> (select GROUP_CONCAT(CONCAT('SUM(if(purchase_date=''',dt,''',revenue,0)) as "',dh,'"')) rv 
    -> from (select dt,DATE_FORMAT(dt,'%a %c-%e') dh FROM 
    -> (select distinct purchase_date dt from purchases) dthdrs) DateHeaders) A; 
Query OK, 1 row affected (0.01 sec) 
mysql> select @voltron\G 
*************************** 1. row *************************** 
@voltron: select user,SUM(if(purchase_date='2012-06-23',revenue,0)) as "Sat 6-23",SUM(if(purchase_date='2012-06-24',revenue,0)) as "Sun 6-24",SUM(if(purchase_date='2012-06-25',revenue,0)) as "Mon 6-25",SUM(if(purchase_date='2012-06-26',revenue,0)) as "Tue 6-26" from purchases GROUP BY user 
1 row in set (0.00 sec) 

mysql> 

OK,whoppie我形成了查询。但它工作吗?

看哪

mysql> PREPARE s1 FROM @voltron; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

mysql> EXECUTE s1; 
+------+----------+----------+----------+----------+ 
| user | Sat 6-23 | Sun 6-24 | Mon 6-25 | Tue 6-26 | 
+------+----------+----------+----------+----------+ 
| 1 |  99 |  17 |  88 |  91 | 
| 4 |  45 |  18 |  55 |  20 | 
| 11 |  39 |  32 |  44 |  26 | 
+------+----------+----------+----------+----------+ 
3 rows in set (0.00 sec) 

mysql> DEALLOCATE PREPARE s1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> 

所以,这是可能的。你只需要用你的想象力让MySQL为你构建查询。

+0

令人印象深刻,感谢您的努力。 – Idr