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

最近才发现写sql的时候,有些时候呢,你知道现在的数据展现结构,也知道自己想要的数据展现结构

但是呢,就是不知道如何实现,所以说,基础很重要,知识储备很重要。

-- ----------------------------

-- 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  <br><br>

 

  

-- ------------------------

-- 行转列统计数据

-- ------------------------

<br>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

### 回答1: MySQL中实现列转行可以使用UNION ALL关键字,也可以使用CASE语句。 下面是使用UNION ALL关键字实现列转行的示例: ``` SELECT 'column1' AS column_name, column1 AS column_value FROM table_name UNION ALL SELECT 'column2' AS column_name, column2 AS column_value FROM table_name UNION ALL SELECT 'column3' AS column_name, column3 AS column_value FROM table_name; ``` 这个查询将列column1、column2和column3从table_name表中转换为行。每个SELECT语句选择列的名称和对应的值,并使用UNION ALL将它们组合在一起。最终的结果是一个包含列名和列值的表格。 下面是使用CASE语句实现列转行的示例: ``` SELECT 'column1' AS column_name, CASE WHEN column_name = 'column1' THEN column1 ELSE NULL END AS column_value FROM table_name UNION ALL SELECT 'column2' AS column_name, CASE WHEN column_name = 'column2' THEN column2 ELSE NULL END AS column_value FROM table_name UNION ALL SELECT 'column3' AS column_name, CASE WHEN column_name = 'column3' THEN column3 ELSE NULL END AS column_value FROM table_name; ``` 这个查询使用CASE语句将每个列的值转换为行。每个SELECT语句选择列的名称和对应的值,并使用UNION ALL将它们组合在一起。最终的结果是一个包含列名和列值的表格。 ### 回答2: MySQL列转行是指将一行数据中的多个列值转换成多行数据,以便更好地处理和分析。以下是两种常见的列转行的写法及详细举例: 1. 使用UNION ALL: - 假设有一张名为student的表,包含id、name和subject1~subject3三个科目的成绩列。 - 使用UNION ALL可以将三个科目的成绩列转换成多行数据: ``` SELECT id, name, 'subject1' AS subject, subject1 AS score FROM student UNION ALL SELECT id, name, 'subject2' AS subject, subject2 AS score FROM student UNION ALL SELECT id, name, 'subject3' AS subject, subject3 AS score FROM student ``` - 上述语句将以id和name为基准,每个科目成绩生成一行数据,其中subject列表示科目名称,score列表示成绩。 2. 使用UNPIVOT: - 假设有一张名为sales的表,包含year、quarter和sales1~sales4四个季度的销售额列。 - 使用UNPIVOT可以将四个季度的销售额列转换成多行数据: ``` SELECT year, quarter, sales_type, sales_amount FROM sales UNPIVOT ( sales_amount FOR sales_type IN (sales1, sales2, sales3, sales4) ) AS unpivot_sales ``` - 上述语句将以year和quarter为基准,每个季度的销售额生成一行数据,其中sales_type列表示季度,sales_amount列表示销售额。 无论是使用UNION ALL还是UNPIVOT,都可以将原表的列转换成多行数据,便于后续的统计和分析。具体使用哪种方法取决于具体的需求和场景。 ### 回答3: 在MySQL中,列转行指的是将一列数据转换为多行数据的过程。一种常见的方法是使用UNION ALL联接多个SELECT语句。 举例来说,假设有一个表employee,包含以下数据: | id | name | salary | |----|------|--------| | 1 | John | 5000 | | 2 | Mary | 6000 | | 3 | Alex | 4500 | 如果要将salary列转换为多行数据,可以使用以下SQL语句: ``` SELECT id, name, salary FROM employee UNION ALL SELECT id, name, salary FROM employee UNION ALL SELECT id, name, salary FROM employee ``` 执行这个语句后,会得到以下结果: | id | name | salary | |----|------|--------| | 1 | John | 5000 | | 2 | Mary | 6000 | | 3 | Alex | 4500 | | 1 | John | 5000 | | 2 | Mary | 6000 | | 3 | Alex | 4500 | | 1 | John | 5000 | | 2 | Mary | 6000 | | 3 | Alex | 4500 | 这样,salary列就被转换为多行数据了。 另一种方法是使用UNION ALL配合子查询。例子如下: ``` SELECT id, name, salary FROM ( SELECT id, name, salary FROM employee ) AS subquery UNION ALL SELECT id, name, salary FROM ( SELECT id, name, salary FROM employee ) AS subquery UNION ALL SELECT id, name, salary FROM ( SELECT id, name, salary FROM employee ) AS subquery ``` 这样也可以得到相同的结果。 需要注意的是,使用UNION ALL会返回所有的行,包括重复的行,所以在上述例子中,重复的行会被返回3次。如果不需要重复的行,可以使用UNION代替UNION ALL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值