Mysql 列转行统计查询 、行转列统计查询

本文介绍了一种使用SQL进行数据转换的方法,包括如何将列转换为行或将行转换为列,适用于需要灵活展示数据的场景。通过具体实例展示了CASE语句和GROUP_CONCAT函数的应用。
-- ----------------------------
-- Table structure for `TabName`
-- ----------------------------
DROP TABLE IF EXISTS `TabName`;
CREATE TABLE `TabName` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(20) DEFAULT NULL,
  `Date` date DEFAULT NULL,
  `Scount` int(11) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of TabName
-- ----------------------------
INSERT INTO `TabName` VALUES ('1', '小说', '2013-09-01', '10000');
INSERT INTO `TabName` VALUES ('2', '微信', '2013-09-01', '20000');
INSERT INTO `TabName` VALUES ('3', '小说', '2013-09-02', '30000');
INSERT INTO `TabName` VALUES ('4', '微信', '2013-09-02', '35000');
INSERT INTO `TabName` VALUES ('5', '小说', '2013-09-03', '31000');
INSERT INTO `TabName` VALUES ('6', '微信', '2013-09-03', '36000');
INSERT INTO `TabName` VALUES ('7', '小说', '2013-09-04', '35000');
INSERT INTO `TabName` VALUES ('8', '微信', '2013-09-04', '38000');
 
 
-- ------------------------
-- 查看数据
-- ------------------------
SELECT  * from TabName ;

-- ------------------------
-- 列转行统计数据
-- ------------------------
SELECT Date ,
MAX(CASE NAME WHEN '小说' THEN Scount ELSE 0 END ) 小说,
MAX(CASE NAME WHEN '微信' THEN Scount ELSE 0 END ) 微信
FROM TabName 
GROUP BY Date

-- ------------------------
-- 行转列统计数据
-- ------------------------
 select
    Date, group_concat(NAME,'总量:',Scount) as b_str from   TabName
 group by Date

select Date,NAME, group_concat(NAME,'总量:',Scount) as b_str from   TabName
group by Date ,NAME




MySQL中进行按月统计数据并实现转行的操作,通常需要结合聚合函数和条件表达式(如 `CASE WHEN` 或 `IF`)来实现。以下是实现方法及原理说明。 ### 按月统计数据并转行的实现 首先,按月统计数据通常涉及时间字段的处理,例如使用 `DATE_FORMAT()` 或 `MONTH()` 函数来提取日期中的月份。然后,将不同月份统计结果从行转换为,这可以通过 `CASE WHEN` 或 `IF` 表达式配合聚合函数实现。 例如,假设有一个表 `sales_data`,其结构如下: ```sql CREATE TABLE sales_data ( id INT PRIMARY KEY AUTO_INCREMENT, sale_date DATE, amount DECIMAL(10, 2) ); ``` 该表记录了销售数据,其中 `sale_date` 表示销售日期,`amount` 表示销售金额。现在需要按月统计销售额,并将结果以转行的方式展示。 #### 使用 `CASE WHEN` 进行转行统计 ```sql SELECT '月销售额' AS category, SUM(CASE WHEN MONTH(sale_date) = 1 THEN amount ELSE 0 END) AS '一月', SUM(CASE WHEN MONTH(sale_date) = 2 THEN amount ELSE 0 END) AS '二月', SUM(CASE WHEN MONTH(sale_date) = 3 THEN amount ELSE 0 END) AS '三月', SUM(CASE WHEN MONTH(sale_date) = 4 THEN amount ELSE 0 END) AS '四月', SUM(CASE WHEN MONTH(sale_date) = 5 THEN amount ELSE 0 END) AS '五月', SUM(CASE WHEN MONTH(sale_date) = 6 THEN amount ELSE 0 END) AS '六月', SUM(CASE WHEN MONTH(sale_date) = 7 THEN amount ELSE 0 END) AS '七月', SUM(CASE WHEN MONTH(sale_date) = 8 THEN amount ELSE 0 END) AS '八月', SUM(CASE WHEN MONTH(sale_date) = 9 THEN amount ELSE 0 END) AS '九月', SUM(CASE WHEN MONTH(sale_date) = 10 THEN amount ELSE 0 END) AS '十月', SUM(CASE WHEN MONTH(sale_date) = 11 THEN amount ELSE 0 END) AS '十一月', SUM(CASE WHEN MONTH(sale_date) = 12 THEN amount ELSE 0 END) AS '十二月' FROM sales_data; ``` 此查询将每个月的销售额计算为单独的[^3]。 #### 使用 `IF` 函数实现转行 如果希望使用 MySQL 特有的 `IF` 函数,也可以实现类似效果: ```sql SELECT '月销售额' AS category, SUM(IF(MONTH(sale_date) = 1, amount, 0)) AS '一月', SUM(IF(MONTH(sale_date) = 2, amount, 0)) AS '二月', SUM(IF(MONTH(sale_date) = 3, amount, 0)) AS '三月', SUM(IF(MONTH(sale_date) = 4, amount, 0)) AS '四月', SUM(IF(MONTH(sale_date) = 5, amount, 0)) AS '五月', SUM(IF(MONTH(sale_date) = 6, amount, 0)) AS '六月', SUM(IF(MONTH(sale_date) = 7, amount, 0)) AS '七月', SUM(IF(MONTH(sale_date) = 8, amount, 0)) AS '八月', SUM(IF(MONTH(sale_date) = 9, amount, 0)) AS '九月', SUM(IF(MONTH(sale_date) = 10, amount, 0)) AS '十月', SUM(IF(MONTH(sale_date) = 11, amount, 0)) AS '十一月', SUM(IF(MONTH(sale_date) = 12, amount, 0)) AS '十二月' FROM sales_data; ``` 该查询同样实现了按月统计数据并以转行的形式呈现[^3]。 #### 动态SQL实现(适用于月份不固定的情况) 当需要动态支持不同月份时,可以使用 MySQL 的预处理语句来构建动态 SQL: ```sql SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(IF(MONTH(sale_date) = ', MONTH(sale_date), ', amount, 0)) AS ''', ELT(MONTH(sale_date), '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'), '''' ) ) INTO @sql FROM sales_data; SET @sql = CONCAT('SELECT ''月销售额'' AS category, ', @sql, ' FROM sales_data'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` 该查询使用动态 SQL 构建每个月的统计,适用于数据表中包含多个不同月份的情况[^3]。 ### 总结 - 按月统计数据并实现转行,可以使用 `CASE WHEN` 或 `IF` 函数结合聚合函数来实现。 - 如果需要支持动态(例如月份不固定),可以借助 MySQL 的预处理语句构建动态 SQL。 - 这些方法在数据报表处理中非常实用,尤其是在数据存储格式与展示形式不一致的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值