如何在mysql中显示数据,如excel中的pivot
我有这样的疑问:如何在mysql中显示数据,如excel中的pivot,mysql,sql,pivot,Mysql,Sql,Pivot,我有这样的疑问: SELECT DATE,REGION,COUNT(*) FROM ALL_ID_DATA WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8)) AND DIRECTION='inbound' AND REASON_1 = 'complaint' GROUP BY REGION,DATE DESC 结果是 下面的捕获显示的正确查询是什么 有人能帮我吗?我想你在找这个: 这种
SELECT DATE,REGION,COUNT(*)
FROM ALL_ID_DATA
WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8))
AND DIRECTION='inbound'
AND REASON_1 = 'complaint'
GROUP BY REGION,DATE DESC
结果是
下面的捕获显示的正确查询是什么
有人能帮我吗?我想你在找这个:
这种类型的查询称为
透视查询。不幸的是,MySQL没有PIVOT
函数,因此需要使用CASE
语句和聚合函数来复制该函数
如果知道要转换的列数,则可以对值进行硬编码:
select region,
SUM(CASE WHEN date = '2012-09-24' THEN 1 END) as `2012-09-24`,
SUM(CASE WHEN date = '2012-09-30' THEN 1 END) as `2012-09-30`,
SUM(CASE WHEN date = '2012-10-01' THEN 1 END) as `2012-10-01`
from ALL_ID_DATA
group by region;
select region,
COUNT(CASE WHEN date = '2012-09-24' THEN 1 ELSE null END) as `2012-09-24`,
COUNT(CASE WHEN date = '2012-09-30' THEN 1 ELSE null END) as `2012-09-30`,
COUNT(CASE WHEN date = '2012-10-01' THEN 1 ELSE null END) as `2012-10-01`
from ALL_ID_DATA
group by region;
看
然后将其添加到现有查询中,将是:
SELECT REGION,
SUM(CASE WHEN date = '2012-09-24' THEN 1 END) as `2012-09-24`,
SUM(CASE WHEN date = '2012-09-30' THEN 1 END) as `2012-09-30`,
SUM(CASE WHEN date = '2012-10-01' THEN 1 END) as `2012-10-01`
FROM ALL_ID_DATA
WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8))
AND DIRECTION='inbound'
AND REASON_1 = 'complaint'
GROUP BY REGION
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when date = ''',
date,
''' then 1 else 0 end) AS ''',
Date(date), ''''
)
) INTO @sql
FROM ALL_ID_DATA;
select @sql;
SET @sql = CONCAT('SELECT region, ', @sql, '
FROM ALL_ID_DATA
WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8))
AND DIRECTION=''inbound''
AND REASON_1 = ''complaint''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
或
现在,如果要将未知数量的日期转换为列,则可以使用,并且您的查询类似于此(请参阅):
然后将原始查询放在准备好的语句中,最终查询将是:
SELECT REGION,
SUM(CASE WHEN date = '2012-09-24' THEN 1 END) as `2012-09-24`,
SUM(CASE WHEN date = '2012-09-30' THEN 1 END) as `2012-09-30`,
SUM(CASE WHEN date = '2012-10-01' THEN 1 END) as `2012-10-01`
FROM ALL_ID_DATA
WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8))
AND DIRECTION='inbound'
AND REASON_1 = 'complaint'
GROUP BY REGION
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when date = ''',
date,
''' then 1 else 0 end) AS ''',
Date(date), ''''
)
) INTO @sql
FROM ALL_ID_DATA;
select @sql;
SET @sql = CONCAT('SELECT region, ', @sql, '
FROM ALL_ID_DATA
WHERE DATE in (SUBDATE(CURDATE(),1),SUBDATE(CURDATE(),2),SUBDATE(CURDATE(),8))
AND DIRECTION=''inbound''
AND REASON_1 = ''complaint''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;