MySQL交叉表的转化

莫名其妙就想到了这个,结果查了很多关于一维表和二维表之间的转换,当然,用excel好解决,这个就不太清楚,就写下来

SELECT name as '姓名',
SUM(CASE WHEN a.`subject` = '语文' THEN result ELSE null END) as '成绩1',
SUM(CASE WHEN a.`subject` = '数学' THEN result ELSE null END) as '成绩2',
SUM(CASE WHEN a.`subject` = '英语' THEN result ELSE null END) as '成绩3'
FROM cj as a GROUP BY NAME;


SELECT name as '姓名',SUM(a.result) as '合计',
SUM(CASE WHEN a.`subject` = '语文' THEN result ELSE null END) as '成绩1',
SUM(CASE WHEN a.`subject` = '数学' THEN result ELSE null END) as '成绩2',
SUM(CASE WHEN a.`subject` = '英语' THEN result ELSE null END) as '成绩3'
FROM cj as a GROUP BY NAME;

 

 其实有个链接也还好https://bbs.youkuaiyun.com/topics/290089305,但这个怪怪的。

我们来看一下别人怎么写的

 


--木有合计,在SQL Server下测试通过 

if object_id('tempdb..#tx') is not null drop table #tx
go
create table #tx(
id int primary key,
c1 char(2),
c2 char(2),
c3 int
);

insert into #tx (id,c1,c2,c3) values (1 ,'A1','B1',9)
insert into #tx (id,c1,c2,c3) values (2 ,'A2','B1',7)
insert into #tx (id,c1,c2,c3) values (3 ,'A3','B1',4)
insert into #tx (id,c1,c2,c3) values (4 ,'A4','B1',2)
insert into #tx (id,c1,c2,c3) values (5 ,'A1','B2',2)
insert into #tx (id,c1,c2,c3) values (6 ,'A2','B2',9)
insert into #tx (id,c1,c2,c3) values (7 ,'A3','B2',8)
insert into #tx (id,c1,c2,c3) values (8 ,'A4','B2',5)
insert into #tx (id,c1,c2,c3) values (9 ,'A1','B3',1)
insert into #tx (id,c1,c2,c3) values (10 ,'A2','B3',8)
insert into #tx (id,c1,c2,c3) values (11 ,'A3','B3',8)
insert into #tx (id,c1,c2,c3) values (12 ,'A4','B3',6)
insert into #tx (id,c1,c2,c3) values (13 ,'A1','B4',8)
insert into #tx (id,c1,c2,c3) values (14 ,'A2','B4',2)
insert into #tx (id,c1,c2,c3) values (15 ,'A3','B4',6)
insert into #tx (id,c1,c2,c3) values (16 ,'A4','B4',9)
insert into #tx (id,c1,c2,c3) values (17 ,'A1','B4',3)
insert into #tx (id,c1,c2,c3) values (18 ,'A2','B4',5)
insert into #tx (id,c1,c2,c3) values (19 ,'A3','B4',2)
insert into #tx (id,c1,c2,c3) values (20 ,'A4','B4',5)


SELECT     c1
          ,sum(CASE
                   WHEN c2='B1' THEN c3
                   ELSE 0
               END) AS [b1]
          ,sum(CASE
                   WHEN c2='B2' THEN c3
                   ELSE 0
               END) AS [b2]
          ,sum(CASE
                   WHEN c2='B3' THEN c3
                   ELSE 0
               END) AS [b3]
          ,sum(CASE
                   WHEN c2='B4' THEN c3
                   ELSE 0
               END) AS [b4]
FROM       #tx
GROUP BY   c1

 


--动态的话

if object_id('tempdb..#tx') is not null drop table #tx
go
create table #tx(
id int primary key,
c1 char(2),
c2 char(2),
c3 int
);

insert into #tx (id,c1,c2,c3) values (1 ,'A1','B1',9)
insert into #tx (id,c1,c2,c3) values (2 ,'A2','B1',7)
insert into #tx (id,c1,c2,c3) values (3 ,'A3','B1',4)
insert into #tx (id,c1,c2,c3) values (4 ,'A4','B1',2)
insert into #tx (id,c1,c2,c3) values (5 ,'A1','B2',2)
insert into #tx (id,c1,c2,c3) values (6 ,'A2','B2',9)
insert into #tx (id,c1,c2,c3) values (7 ,'A3','B2',8)
insert into #tx (id,c1,c2,c3) values (8 ,'A4','B2',5)
insert into #tx (id,c1,c2,c3) values (9 ,'A1','B3',1)
insert into #tx (id,c1,c2,c3) values (10 ,'A2','B3',8)
insert into #tx (id,c1,c2,c3) values (11 ,'A3','B3',8)
insert into #tx (id,c1,c2,c3) values (12 ,'A4','B3',6)
insert into #tx (id,c1,c2,c3) values (13 ,'A1','B4',8)
insert into #tx (id,c1,c2,c3) values (14 ,'A2','B4',2)
insert into #tx (id,c1,c2,c3) values (15 ,'A3','B4',6)
insert into #tx (id,c1,c2,c3) values (16 ,'A4','B4',9)
insert into #tx (id,c1,c2,c3) values (17 ,'A1','B4',3)
insert into #tx (id,c1,c2,c3) values (18 ,'A2','B4',5)
insert into #tx (id,c1,c2,c3) values (19 ,'A3','B4',2)
insert into #tx (id,c1,c2,c3) values (20 ,'A4','B4',5)

select * from #tx 

declare @sql varchar(8000)
set @sql='select c1,'
select @sql=@sql+'sum(case when c2='''+cast(c2 as varchar(10))+''' then c3 else 0 end)['+cast(c2 as varchar(10))+'],'
from (select distinct c2 from #tx ) a
print(@sql)

set @sql=left(@sql,len(@sql)-1)+' from #tx group by c1'
exec(@sql)
if object_id('tempdb..#tx') is not null drop table #tx

/*
A1	9	2	1	11
A2	7	9	8	7
A3	4	8	8	8
A4	2	5	6	14
*/

这种写法我没遇见过,记录一下。
当然,https://blog.youkuaiyun.com/a437629292/article/details/50317909这个链接讲到了所有,但是感觉没有意义吧,完全是代码思维。

### 如何在 Spark 环境下安装与配置 MySQL 8.0 #### 安装 MySQL 8.0 为了在 Linux 上安装 MySQL 8.0,可以下载官方提供的二进制文件并解压。以下是具体操作方法: 通过 `wget` 命令获取 MySQL 的压缩包,并将其解压至指定目录: ```bash wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz ``` 完成上述步骤后,需设置环境变量以便于后续使用[^2]。 --- #### 配置 Spark 连接 MySQL 8.0 为了让 Spark 能够成功连接到 MySQL 数据库,需要引入合适的 JDBC 驱动程序。以下是详细的配置过程: ##### 下载 MySQL Connector/J 访问 Maven Repository 获取最新版的 MySQL Connector/J 并添加到项目依赖中。如果使用的是 Maven 构建工具,则可以在项目的 `pom.xml` 文件中加入以下内容: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 对于非 Maven 工程或者直接运行命令的情况,可以通过手动指定驱动路径来实现[^4]。 启动 Spark Shell 或提交作业时附加必要的参数以加载该 JAR 包: ```bash ./bin/spark-shell --jars /usr/local/spark/jars/mysql-connector-java-8.0.13.jar \ --driver-class-path /usr/local/spark/jars/mysql-connector-java-8.0.13.jar ``` 此方式确保了 Spark 应用能够识别 MySQL 数据源[^1]。 --- #### 多表查询及 DataFrame 操作 当利用 Spark SQL 对存储于 MySQL 中的数据执行复杂查询(如跨多个表格联结)时,可能遇到默认禁用交叉联结的问题。此时可通过调整会话级配置允许此类操作发生: ```scala spark_session.conf.set("spark.sql.crossJoin.enabled", true) ``` 之后便可基于 DataFrames 执行各种转换逻辑[^3]。 示例代码展示如何读取来自 MySQL 表格的信息并转化为分布式集合形式供进一步分析之用: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("MySQL to Spark") .getOrCreate() // 设置数据库连接属性 val connectionProperties = new java.util.Properties() connectionProperties.put("user", "your_username") connectionProperties.put("password", "your_password") // 加载数据作为 DataFrame val df = spark.read.jdbc( url = "jdbc:mysql://localhost:3306/your_database", table = "(SELECT * FROM your_table) AS subquery", properties = connectionProperties) df.show() // 显示前几条记录 ``` --- #### 解决常见错误 有时即使完成了以上所有准备工作仍会出现异常状况,比如版本不兼容引起的类找不到等问题。这时应仔细核对所使用的组件间是否存在冲突现象;必要情况下升级或降级某些模块直至匹配为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值