2012-06-26 3 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; 

И я хочу, чтобы изменить формат даты столбцов, чтобы быть похожим на «Mon 6-10», делая что-то вроде

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') 

Но я получаю ошибку SQL: ERROR 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

Возможно, я ошибаюсь, но ЕСЛИ может работать только в рамках программы, возможно, вам придется использовать CASE. – Kermit

+0

Оператор ищет имена _column_ в форматированном виде. Однако я бы просто позвонил сценарию вызова/программного обеспечения. – Wrikken

ответ

2

Веришь ли у меня есть решение?

Мне действительно пришлось использовать свое воображение на этом. Я немного изменил запрос, чтобы выполнить SUM в день. Пожалуйста, проследите:

Вы в основном нужно построить этот запрос,

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; 

из этого один

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

Во-первых, давайте сделаем некоторые примеры данных:

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> 

ОК, 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

Смежные вопросы