1

再次您好,并提前感谢您的帮助。

我已经检查了几个先前的问题,但找不到这种确切的情况。

我正在尝试将行转置/旋转到列,但结果基于 where 子句中的日期函数,这使我的选择有些可变。

选择
DATE_FORMAT(packet_details.installDate,'%m-%d-%Y') as Install_Date,
计数(packet_details.installDate)
从
数据包详细信息
在哪里
 packet_details.installDate >= CURRENT_DATE - INTERVAL 7 DAY
 AND packet_details.installDate "*lessthan*" CURRENT_DATE + INTERVAL 7 DAY
按安装日期分组
*小于符号不会显示在堆栈上,我不知道如何修复它

不确定这是否有意义,所以我加入了一个小提琴:http ://sqlfiddle.com/#!2/5b235/3/0 所以是这样的:

INSTALL_DATE COUNT
2013 年 1 月 24 日 2
2013 年 1 月 25 日 2
2013 年 1 月 26 日 2
2013 年 1 月 27 日 2
2013 年 1 月 28 日 2
2013 年 1 月 29 日 1
2013 年 2 月 3 日 1
2013 年 2 月 4 日 1
2013 年 2 月 5 日 5
2013 年 2 月 6 日 4

转换成:

安装日期 1/24/2013 1/25/2013 1/26/2013 1/27/2013 1/28/2013....   
计数 2 2 2 2 2 1     
4

1 回答 1

2
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;
于 2013-01-31T06:28:47.567 回答