数据库数据 与 excel 对比。(项目一)
0、python 与 mysql 连接(增删改查)
python 与 mysql 连接(增删改查)_Jack_2085的博客-CSDN博客1、查询数据库的某一张表#!/usr/bin/python# -*- coding: UTF-8 -*-# 查询数据库的某一张表import MySQLdbdb = ""def mysql_conn(): global db try: # 打开数据库连接 db = MySQLdb.connect("localhost", "root", "dong2025", "mysql8", charset='utf8') #https://blog.csdn.net/weixin_54217632/article/details/121078913?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22121078913%22%2C%22source%22%3A%22weixin_54217632%22%7D
0.1、
0.2、
0.3、
1、解释说明:读数据库数据,转换成字典;取excel数据数据,转换成字典;再写一个对比两个字典的方法。
1.1、封装的类(里面不需要动)
import pandas as pd
import pymysql
import openpyxlclass sql_excel:# 通过类的__init__函数,初始化数据def __init__(self, data_sql, excel_path, col_start, col_end):self.data_sql = data_sqlself.excel_path = excel_pathself.col_start = col_startself.col_end = col_end# sql_data 查询数据库数据def sql_for(self):db = ""dc_dict = {}try:# 打开数据库连接db = pymysql.connect(host="192...........",port=3306,user="root",password="root123",database="zh..........",charset="utf8",)sql = self.data_sqldf_sql = pd.read_sql(sql, db)# 取出全部行,迭代输出,保存在字典中。for index, row in df_sql.iterrows():dc_dict[list(row.values)[0]] = list(row.values)[1:]# 返回数据库字典return dc_dictexcept:# Rollback in case there is any errordb.rollback()finally:db.close()# 取出excel的值,迭代输出,保存在字典中(按行迭代输出)def pc_for(self):# 路径参数str_path = self.excel_pathwb_pc = openpyxl.load_workbook(str_path)ws_pc = wb_pc.activedictA_pc = {}dict_tile_pc = ""# 指定区域中的位置col_start = self.col_startcol_end = self.col_endfor row in ws_pc[col_start: col_end]:# 遍历每一行中的每一单元格x = 0listS_pc = []for c in row:x += 1if x == 1:dict_tile_pc = c.valueelse:listS_pc.append(c.value)dictA_pc[dict_tile_pc] = listS_pcreturn dictA_pc# 数据库sql与excel对比def dict_compare(self):global key# 保存缺少行value(错误信息保存)listS = []# 保存缺少行名(错误信息保存)listL = []str1 = self.pc_for()str2 = self.sql_for()# 1、先输出一个其中一个字典的key和values# 2、直接拿着这个values和另一个字典中的的values对比。# 3、str2[key][list_i]可以先通过key,拿到一个字典的value# 4、两个value的值确定了,就可以比较了。把错误信息保存在list列表中。try:for key, value in str1.items():for list_i, list_value in enumerate(value):if list_value != str2[key][list_i]:li_error = key, ":", list_valuelistS.append(li_error)except:listL.append(key)# 判断excel是否定位正确try:if key is None:return "excel 定位错误"else:return "行value错误:", listS, "缺少行名:", listLexcept:return "excel 定位错误"
1.2、调用封装的类,对比数据(单次调用)。
import srcd.t_data.py_sql_excel as pyResultsql = "select *, sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU', " \"concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/" \"sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi' " \"from( " \"select t.company_name as 'company_n1',SUM(t.actual_num) as 'actual_n1', " \"sum(CASE t.boxType WHEN '20GP' THEN 1 ELSE 0 END) as '20GP'," \"sum(CASE t.boxType WHEN '20RF' THEN 1 ELSE 0 END) as '20RF', " \"sum(CASE t.boxType WHEN '40RF' THEN 1 ELSE 0 END) as '40RF', " \"sum(CASE t.boxType WHEN '40HC' THEN 1 ELSE 0 END) as '40HC', " \"sum(CASE t.boxType WHEN '40RH' THEN 1 ELSE 0 END) as '40RH', " \"sum(CASE t.boxType WHEN '20' THEN 1 ELSE 0 END) as '20n', " \"sum(CASE t.boxType WHEN '40' THEN 1 ELSE 0 END) as '40n', " \"sum(CASE t.boxType WHEN '特殊' THEN 1 ELSE 0 END) as 'tsn' " \"from dm_container_volume t " \"GROUP BY t.company_name) ta " \"group by ta.company_n1"str_path = "./dataFile/pc_for.xlsx"
col_start = "B3"
col_end = "M4"result_se = pyResult.sql_excel(sql, str_path, col_start, col_end).dict_compare()
print(result_se)
1.2、用for循环通过取字典的k,v值,来对比多张不同维度的报表
import srcd.t_data.py_sql_excel as pyResult
import time# 用for循环通过去字典的k,v值,来对比多张不同维度的报表
zd_str_path = {"company_name": "./dataFile/pc_for.xlsx"}
for zd, str_path in zd_str_path.items():sql = "select *, sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU', " \"concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/" \"sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi' " \"from( " \f"select t.{zd} as 'company_n1',SUM(t.actual_num) as 'actual_n1', " \"sum(CASE t.boxType WHEN '20GP' THEN 1 ELSE 0 END) as '20GP'," \"sum(CASE t.boxType WHEN '20RF' THEN 1 ELSE 0 END) as '20RF', " \"sum(CASE t.boxType WHEN '40RF' THEN 1 ELSE 0 END) as '40RF', " \"sum(CASE t.boxType WHEN '40HC' THEN 1 ELSE 0 END) as '40HC', " \"sum(CASE t.boxType WHEN '40RH' THEN 1 ELSE 0 END) as '40RH', " \"sum(CASE t.boxType WHEN '20' THEN 1 ELSE 0 END) as '20n', " \"sum(CASE t.boxType WHEN '40' THEN 1 ELSE 0 END) as '40n', " \"sum(CASE t.boxType WHEN '特殊' THEN 1 ELSE 0 END) as 'tsn' " \"from dm_container_volume t " \f"GROUP BY t.{zd}) ta " \"group by ta.company_n1"col_start = "B3"col_end = "M4"result_se = pyResult.sql_excel(sql, str_path, col_start, col_end).dict_compare()time.sleep(2)print(result_se)
2、pandas 遍历 dataframe 行数据
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print(df)# pandas 遍历 dataframe 行数据
for index, row in df.iterrows():print(index,row[0],row[1],)# pandas 遍历 dataframe 列数据
for x in df.loc[:,'c1']:print(x)
3、 pandas抽取行列数据_zhf的博客-CSDN博客_pandas取列值https://blog.csdn.net/weixin_43283397/article/details/104263743
4、
4.1、创建一个字典,把数据放在字典里,字段名称是key,字段内容是values(也可以理解成迭代输出列,并保存字典中)
4.2、pymysql,pandas,mysql一起来操作数据库,并保存在excel中
import pandas as pd
import pymysqldb = ""def mysql_conn():global dbtry:# 打开数据库连接db = pymysql.connect(host="localhost",port=3306,user="root",password="dong2025",database="mysql8",charset="utf8",)sql = "SELECT * FROM BOOK"df_sql = pd.read_sql(sql, db)# return df_sql # 展示所有结果return df_sql.head() # 默认展示前5行# return df_sql.head(2) # 展示前2行# return df_sql.shape # 统计行和列数。# return df_sql.info() # info()方法可以查看数据表中的数据类型# return df_sql.describe() # 对BOOK表的描述except:# Rollback in case there is any errordb.rollback()finally:db.close()my_con = mysql_conn()
my_con.to_excel("C:/Users/Administrator/Desktop/123456/202201101647.xlsx")
print(my_con)
print("***************************")# 创建一个字典,把数据放在字典里,字段名称是key,字段内容是values
t_dict = {}
for x, y in my_con.items():print("x=", x, "y=", list(y.values))t_dict[x] = list(y.values)
print("t_dict=", t_dict)
print("**********************")# 根据字段名称取数据
print(my_con["book_name"] + " " + my_con["writer"])
5、 case when的用法详解
SQL之CASE WHEN用法详解__Rt-CSDN博客_case when用法https://blog.csdn.net/rongtaoup/article/details/82183743
5.1、自己写的例子:
5.2、根据上面的图片,生成虚拟的列(不需要分组)
select sum(CASE WHEN t.score< 60 THEN 1 ELSE 0 END) as "小于60(不包含60)",sum(CASE WHEN 60<=t.score and t.score< 80 THEN 1 ELSE 0 END) as "大于60小于80(包含60,不包含80)",sum(CASE WHEN 80<=t.score and t.score< 100 THEN 1 ELSE 0 END) as "大于80小于100(不包含100,包含80)"
from student_table t
生成效果:
5.3、生成虚拟的行(需要分组)
select (CASE WHEN t.score<60 THEN "小于60(不包含60)"WHEN t.score<80 THEN"大于60小于80(包含60,不包含80)"WHEN t.score<100 THEN"大于80小于100(不包含100,包含80)"ELSE"其他"
END) as score_levev, count(t.id) as stu_cnt
from student_table t
GROUP BY
(CASE WHEN t.score<60 THEN"小于60(不包含60)"WHEN t.score<80 THEN"大于60小于80(包含60,不包含80)"WHEN t.score<100 THEN"大于80小于100(不包含100,包含80)"ELSE"其他"
END)
sql语句优化方案如下:
-- ====================================== 优化方案1
select c.leibie,count(*) as "数量" from
(select CASE
WHEN score<60 THEN
"小于60(不包含60)"
WHEN 60<=score and score<80 THEN
"大于60小于80(包含60,不包含80)"
WHEN 80<=score and score<100 THEN
"大于80小于100(包含80,包含100)"
ELSE
"其他"
END as "leibie"
from a)c
group by c.leibie
-- ===================================优化方案2
select c.leibie,count(*) as "数量" from
(select CASE
WHEN score<60 THEN
"小于60(不包含60)"
WHEN score<80 THEN
"大于60小于80(包含60,不包含80)"
WHEN score<100 THEN
"大于80小于100(包含80,包含100)"
ELSE
"其他"
END as "leibie"
from a)c
group by c.leibie
6、case when的用法
里面还有数据库脚本
case when 的用法举例说明_Jack_2085-CSDN博客https://blog.csdn.net/weixin_54217632/article/details/122510989?spm=1001.2014.3001.5501
case when代码例子说明:
-- ---- 1、虚拟多列的需要用把case when分开单独写。
-- ---- 2.1、虚拟一列内容需要通过判断填写的,比如性别列,
-- ---- 2.2、内容需要填写(男/女),可以把casewhen写在一起,
-- ---- 2.3、一个end结束符,一个as 别名就ok了,
-- ---- 2.4、根据不同情况,用不同方法。-- -------------------- 实现方法(完整版写法)
-- -------------------- ELSE 0 也可以不要select *,
sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH) as 'TEU',
concat((Round(((sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH)/
sum(ta.20GP+ta.20RF+ta.40RF+ta.40HC+ta.40RH+ta.20n+ta.40n+ta.tsn))*100),2)),'%') as 'zhanbi'
from(
select t.company_name as 'company_n1',SUM(t.actual_num) as 'actual_n1', sum(CASE t.boxType WHEN '20GP' THEN 1 ELSE 0 END) as '20GP',sum(CASE t.boxType WHEN '20RF' THEN 1 ELSE 0 END) as '20RF',sum(CASE t.boxType WHEN '40RF' THEN 1 ELSE 0 END) as '40RF',sum(CASE t.boxType WHEN '40HC' THEN 1 ELSE 0 END) as '40HC',sum(CASE t.boxType WHEN '40RH' THEN 1 ELSE 0 END) as '40RH',sum(CASE t.boxType WHEN '20' THEN 1 ELSE 0 END) as '20n',sum(CASE t.boxType WHEN '40' THEN 1 ELSE 0 END) as '40n',sum(CASE t.boxType WHEN '特殊' THEN 1 ELSE 0 END) as 'tsn'
from dm_container_volume t
GROUP BY t.company_name) ta
group by ta.company_n1
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
17、
18、
19、
20、
21、
22、
23、
24、
25、
26、
27、
28、
29、
30
数据库数据 与 excel 对比。(项目一)相关推荐
- 数据库数据用Excel导出的3种方法
数据库数据用Excel导出的3种方法 分类: .Net 2008-06-30 11:07 173人阅读 评论(2) 收藏 举报 将数据库数据用Excel导出主要有3种方法:用Excel.Applica ...
- Python读取数据库数据写入Excel
Python读取数据库数据写入Excel 本文示例: 读取数据库数据 创建Excel文件,并创建指定名称的sheet页 将数据库数据写入创建的sheet页中 保存文件 示例代码: # -*- codi ...
- oracle导出一个表数据库,excel怎么导出多个表格数据库数据-一个excel表格中有多个sheet,如何将其导入oracle数......
一个excel表格中有多个sheet,如何将其导入oracle数... 解决方案如下: 可以新建一个查询,查询你所说的2个表中的所有数据 运行查询,这样查询结果就包含了你要的数据,再把查询结果导出 就 ...
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outP ...
- java struts2 excel上传_Java Struts2 实现数据库数据导出Excel文件
HTML: 导出 Struts.xml true application/vnd.ms-excel;charset=GBK excelStream attachment;filename=${file ...
- ASP.NET中数据库数据导入Excel并打印
众所周知,WEB上的打印是比较困难的,常见的WEB上打印的方法大概有三种: 1.直接利用IE的打印功能.一般来说,这种方法可以做些扩展,而不是单单的调用javascript:print()这样简单,比 ...
- java数据生成excel_Java 数据库数据生成Excel
采用jxl.jar生成Excel 项目开发注意事项: 1:导入从网上下载的jar包: mail.jar 和 activation.jar 2:删掉C:\Program Files\MyEclipse\ ...
- excel html 查询,html 连接 excel表格数据库数据-利用EXCEL表格为数据库制作查询网页...
请教如何将HTML中有链接的数据提取到EXCEL表格里? 将网页中的数据拷贝到excel表格中,默认是全部选中的,您只要单击鼠标右键选择删除超链接即可(此操作在excel2010上测试通过) 请问EX ...
- 将数据库数据导入Excel表格
目录 导入依赖 生成表格代码 导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId> ...
最新文章
- 范成法加工matlab_光学非球面技术原理与加工技术
- supermap iobect .net 7.1.2 图例的拆分
- autocad.net中ResultBuffer相关的常量值
- 如何查询当前表空间下所有实例_详解人大金仓MPP数据库并行查询技术
- PHP快速导入,php快速导入大量数据的实例方法
- 20个非常棒的Jquery实用工具 [转]
- Manacher's algorithm: 最长回文子串算法
- 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
- 491. 递增子序列
- Shell脚本的模块化和脚本复用
- mysql8.0 linux 安装
- 解决Maven下载慢的问题
- 快速记住《计算机文化基础》海量题法
- 字符串的常见方法总结
- ie不能加载java_解决IE中页面Java无法加载的问题
- codeforces1100 F. Ivan and Burgers(线性基)
- 购物时,商品加入购物车的飞入效果
- utf8版 中文转换成拼音
- 前端涨薪必读,node.js入门保姆级教程
- 微信小程序实现酒店入住时间区间选择日历