2012-06-26 82 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