2013-06-11 3 views
1

Я хочу что-то, что выглядит следующим образом:SQL Pivot Синтаксис

Group | ID | Date | Time | Phone Number | How tired are you? | How happy are you? | 
    1 | A23 | 1/1/12 | 5:30:00 | 80|   5   |   8   |  

Тем не менее, я получаю это:

Group | ID | Date | Time | Phone Number |  Question  | Answer | 
    1 | A23 | 1/1/12 | 5:30:00 | 80| How tired are you? |  5 | 
    1 | A23 | 1/1/12 | 5:30:00 | 80| How happy are you? |  8 |    

Я посмотрел много возможных решений и знаю, что я должны использовать Pivot для таких случаев. Однако я не могу заставить синтаксис работать. Ниже мой текущий код:

SELECT 
CASE when a.send_time between '2012-1-1 00:00:00' and '2012-1-2 23:59:59' then 1 
    else 2 
    end as "group", 
u.id AS ID, 
cast(a.send_time as date) AS "Date", 
cast(a.send_time as time) AS "Time", 
u.cellphone AS "Phone Number", 
i.question AS "Question", 
a.answer AS "Answer" 
FROM 
    answer a, option o, box b, item i, user u 
WHERE 
    a.id = b.id and 
    a.item_id = i.item_id and 
    o.item_id = a.item_id and 
    o.value = a.answer and 
    u.id = a.user_id; 

Я использую MySQL. Спасибо!!!

+0

Что ваша платформа базы данных? Доступ, сервер MS-SQL, MySQL или Postgres? Синтаксис не одинаковый для всех из них. – itsols

+0

Я использую MySQL. Я добавлю это к вопросу. Благодаря! –

+0

Если вы ищете SO для 'mysql pivot table', этот вопрос будет первым. – Barmar

ответ

2

Попробуйте

SELECT q.`Group`, q.`ID`, q.`Date`, q.`Time`, q.`Phone Number`, 
    MIN(CASE WHEN Question = 'How tired are you?' THEN Answer ELSE NULL END) `How tired are you?`, 
    MIN(CASE WHEN Question = 'How happy are you?' THEN Answer ELSE NULL END) `How happy are you?` 
FROM 
(
SELECT 
     CASE when a.send_time between '2012-1-1 00:00:00' AND '2012-1-2 23:59:59' then 1 
     ELSE 2 END as `group`, 
     u.id AS ID, 
     cast(a.send_time as date) AS `Date`, 
     cast(a.send_time as time) AS `Time`, 
     u.cellphone AS `Phone Number`, 
     i.question AS `Question`, 
     a.answer AS `Answer` 
FROM 
    answer a, option o, box b, item i, user u 
WHERE 
    a.id = b.id and 
    a.item_id = i.item_id and 
    o.item_id = a.item_id and 
    o.value = a.answer and 
    u.id = a.user_id; 
) q 
GROUP BY q.`Group`, q.`ID`, q.`Date`, q.`Time`, q.`Phone Number` 
+0

Благодарим вас за ответ. Но приведенный выше код является лишь упрощенной версией моего кода SQL. На самом деле, как> 100 вопросов, поэтому я хочу использовать Pivot, чтобы сделать код более чистым и менее копировать и вставлять –

+0

@DaoLam Вы могли бы упомянуть об этом в вопросе. В MySql нет 'PIVOT'. Вам придется прибегать к динамическому SQL. Более того, я не могу представить, чтобы кто-то читал такой результат, если у вас есть> 100 вопросов. Если, с другой стороны, вы делаете это для уровня представления IMHO, вы должны его удалить и сделать это, используя язык программирования на стороне клиента по вашему выбору (например, php). – peterm

+0

У меня на самом деле нет клиентской стороны. Они просто хотят, чтобы в этом формате был лист Excel. Спасибо, хотя! И нужно ли ключевое слово «MIN»? –