2015-07-03 2 views
3

У меня есть данные, как это:MySQL - Как я могу сделать запрос для этого вывода?

+-------+--------+---------------------+ 
| name | status | date    | 
+-------+--------+---------------------+ 
| Peter | 100 | 2015-06-20 12:12:00 | 
| Peter | 100 | 2015-06-20 15:12:00 | 
| James | 100 | 2015-06-20 10:12:00 | 
| James | 200 | 2015-06-20 14:12:00 | 
| James | 100 | 2015-06-21 06:12:00 | 
| James | 100 | 2015-06-21 09:12:00 | 
| Peter | 200 | 2015-06-21 13:12:00 | 
| Peter | 100 | 2015-06-21 14:12:00 | 

И я хочу такой вывод:

+----------+-------+-------+-------+ 
| date  | Peter | James | Total | 
+----------+-------+-------+-------+ 
| 20150620 |  2 |  2 |  4 | 
| 20150621 |  2 |  2 |  4 | 
+----------+-------+-------+-------+ 

Я использую select заявление ниже:

select DATE_FORMAT(date, "%Y%m%d") as date, 
SUM(IF(name = "Peter", 1,0)) AS "Peter", 
SUM(IF(name = "James", 1,0)) AS "James", 
SUM(IF(name != "0", 1,0)) AS "Total" 
from test group by DAYOFMONTH (date); 

Но что я должен делать, если я имеют много имен? Я не могу поместить все имена в select state in SUM(IF name ="????").

+0

Возможный дубликат [MySQL сводной таблицы] (http://stackoverflow.com/questions/7674786/mysql-pivot-table) – Barranka

+0

Вы ищете поворот таблицы. Если вы Google mysql pivot, вы получите много учебников и связанных с ними вопросов. Взгляните на это: http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in-mysql/ –

ответ

0

Чтобы получить такой набор результатов (возвращаемый оператором SQL SELECT) с отдельным столбцом для каждого значения имени, вам обязательно нужно включить выражение в список SELECT для каждого возвращаемого столбца.

Число, типы и имена столбцов, возвращаемых из оператора SELECT, должны указываться при выполнении оператора. Это не может быть изменено динамически при выполнении оператора.

Несколько вариантов для рассмотрения:

  • Если вы действительно нужна эта динамика, с любым количеством значений имен, в одном запросе, рассмотреть возможность возвращения это как отдельные строки, и обработка стержень на сторона клиента.

  • Используйте отдельный запрос, чтобы получить четкий список name значений, а также использовать возврат от этого динамически построить второе заявление (как тот, который вы используете.)

+0

Большое спасибо spencer7593, –

0

Что вы хотите является сводной таблицей.

MySQL не имеет встроенный в сводной таблице полезности Contruction, но вы можете сделать это вручную, используя подготовленные заявления:

-- Initialize a variable to store the query string 
set @sql = null; 
-- Build the query string for each grouped ('name') column and store it 
-- into the @sql variable 
select group_concat(distinct 
        concat("sum(case when name = '", name, "' then 1 
           else 0 
           end) as `", name, "`" 
         ) 
        separator ', ') 
into @sql 
from test; 
-- Complete the query string and store it in the @sql variable 
set @sql = concat("select date_format(`date`, '%Y%m%d') as `dt`", @sql, " from test group by date(`dt`)"); 
-- Create a prepared statement and execute it 
prepare stmt from @sql; 
execute stmt; 
-- When you're done, deallocate the prepared statement 
deallocate prepare stmt; 

Here's a working example in SQLfiddle.

Проверить this question and its answers для получения дополнительной информации.

Надеюсь, это вам поможет.

+0

Большое спасибо Barranka. –

+0

@Onthemoon, если вы найдете этот ответ полезным, выдвигаете его или, если он решает проблему тура, примите его – Barranka

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