mysql, транспонировать/повернуть строку в столбец, выбрать переменную

Здравствуйте еще раз и заранее спасибо за вашу помощь.

Я проверил несколько предыдущих вопросов и не смог найти эту точную ситуацию.

Я пытаюсь транспонировать/повернуть строку в столбец, но результаты основаны на функции даты в предложении where, что делает мой выбор несколько переменным.

SELECT
DATE_FORMAT(packet_details.installDate,'%m-%d-%Y') as Install_Date,
Count(packet_details.installDate)
FROM
packet_details
WHERE
 packet_details.installDate >= CURRENT_DATE - INTERVAL 7 DAY
 AND packet_details.installDate "*lessthan*" CURRENT_DATE + INTERVAL 7 DAY
GROUP BY installDate
*lessthan symbol wont show here on Stack & i don't know how to fix it

Не уверен, что это имеет смысл, поэтому я включил скрипт: http://sqlfiddle.com/#!2/5b235/3/0 Что-то вроде этого:

INSTALL_DATE     COUNT
1/24/2013         2
1/25/2013         2
1/26/2013         2
1/27/2013         2
1/28/2013         2
1/29/2013         1
2/3/2013          1
2/4/2013          1
2/5/2013          5
2/6/2013          4

Превратился в:

INSTALL_DATE    1/24/2013   1/25/2013   1/26/2013   1/27/2013   1/28/2013....   
COUNT             2             2          2             2         2               1     

person alex    schedule 31.01.2013    source источник
comment
Вам нужно решение только для SQL? Или может помочь какой-нибудь PHP (или другой язык)?   -  person Oscar Pérez    schedule 31.01.2013
comment
Возможный дубликат: ‹a href=stackoverflow.com/questions/4943496/  -  person Oscar Pérez    schedule 31.01.2013
comment
Спасибо, Оскар, пока я ищу только sql.   -  person alex    schedule 02.02.2013


Ответы (1)


SELECT  Install_DATE,
        MAX(CASE WHEN Install_DATE = '01-24-2013' THEN totalCount END) `01-24-2013`,
        MAX(CASE WHEN Install_DATE = '01-25-2013' THEN totalCount END) `01-25-2013`,
        MAX(CASE WHEN Install_DATE = '01-26-2013' THEN totalCount END) `01-26-2013`,
        .......
FROM
(
  SELECT DATE_FORMAT(packet_details.installDate,'%m-%d-%Y') as Install_Date,
         Count(packet_details.installDate) totalCount
  FROM   packet_details
  WHERE  packet_details.installDate >= CURRENT_DATE - INTERVAL 7 DAY AND 
         packet_details.installDate   < CURRENT_DATE + INTERVAL 7 DAY
  GROUP  BY installDate
) s

Для неизвестного количества Install_Date гораздо предпочтительнее использовать динамический запрос,

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN Install_DATE = ''',
      Install_Date,
      ''' then totalCount end) AS `', Install_Date, '`' )
  ) INTO @sql
FROM 
(
  SELECT DATE_FORMAT(packet_details.installDate,'%m-%d-%Y') as Install_Date,
         Count(packet_details.installDate) totalCount
  FROM   packet_details
  WHERE  packet_details.installDate >= CURRENT_DATE - INTERVAL 7 DAY AND 
         packet_details.installDate   < CURRENT_DATE + INTERVAL 7 DAY
  GROUP  BY installDate
) s;

SET @sql = CONCAT('SELECT Install_DATE, ', @sql, ' 
                    FROM
                    (
                      SELECT DATE_FORMAT(packet_details.installDate,''%m-%d-%Y'') as Install_Date,
                             Count(packet_details.installDate) totalCount
                      FROM   packet_details
                      WHERE  packet_details.installDate >= CURRENT_DATE - INTERVAL 7 DAY AND 
                             packet_details.installDate   < CURRENT_DATE + INTERVAL 7 DAY
                      GROUP  BY installDate
                    ) s');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
person John Woo    schedule 31.01.2013
comment
Спасибо, JW, с нетерпением жду возможности попробовать динамический запрос, сообщит об этом. - person alex; 02.02.2013
comment
JW, еще раз спасибо, я вижу, что это работает в скрипте, но я не могу заставить его работать в phpmyadmin. также есть способ не включать эту метку install_date в первое поле, поскольку она отражает конкретную дату. - person alex; 05.02.2013
comment
В конце концов я получил эту работу, еще раз спасибо, я думаю, что мне просто нужен перезапуск! У меня был еще один быстрый вопрос. Я создал еще одну скрипку с измененной и дополнительной таблицей. Не могли бы вы помочь мне понять, как заменить значение в R2C1 результатом предложения where на основе отношения между userId в обеих таблицах. Например, если бы мы просто хотели показать даты установки, где userId = 1, и отобразить имя Билли в R2C1. Я не могу понять, где изменить выбор, чтобы отразить имя, не нарушая запрос. sqlfiddle.com/#!2/6ff68/1 - person alex; 06.02.2013