Python中如何编写SQL查询语句?

table 如下 表名就叫 x_table 吧

date | name | count
‘20181018’ | laowang | 100
’20181018’ | laoli | 120
’20181016’ | laoli | 1440
’20181016’ | laowang | 108

期望查询到的结果是这样的
date | count1(laowang 的) | count2(laoli 的) | count1+count2
’20181018’ | 100 | 120 | 220


写的有点简陋
Python中如何编写SQL查询语句?


21 回复

行转列?


在Python里写SQL查询,直接用字符串就行,但更推荐用参数化查询来防SQL注入。比如用sqlite3库:

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 用问号占位符
user_id = 5
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))

# 或者用命名占位符
cursor.execute("SELECT * FROM users WHERE id = :id", {'id': user_id})

rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close()

用ORM框架比如SQLAlchemy的话,查询会更Pythonic:

from sqlalchemy import create_engine, MetaData, Table

engine = create_engine('sqlite:///example.db')
metadata = MetaData()
users = Table('users', metadata, autoload_with=engine)

# 直接写SQL
result = engine.execute("SELECT * FROM users WHERE id = :id", id=5)

# 用SQLAlchemy的查询API
from sqlalchemy import select
stmt = select(users).where(users.c.id == 5)
result = engine.execute(stmt)

for row in result:
    print(row)

核心就两点:简单查询直接写字符串,复杂或需要防注入就用参数化。

再来一个 laosun 呢?如果 name 有 1 万种呢?
你这样的做法,就是挖坑害人。

记得之前学的时候弄过这种绕了半天 工作了发现完全用不到…

意思应该是同一天的相同姓名,求和

一点一点来比较简单
先插日期到表。
选名字日期,对应的求和(应该好查),也放到表。

噢噢噢噢 表变长了啊。。。
name 数会一直增长吗。。就是挖坑啊

哈哈 我搞错了

考虑变成’20181018’ | ( 100,200 ) | 220

括号里面变长应该没问题

没用过数据库纯属瞎哔哔路过

<br>SELECT<br> <a target="_blank" href="http://s.date" rel="nofollow noopener">s.date</a> ,<br> sum(s.zhangsan) ,<br> sum(s.lisi) ,<br> sum(s.zhangsan) + sum(s.lisi) 'count1+count2'<br>FROM<br> (<br> SELECT<br> date ,<br> CASE<br> WHEN NAME = 'zhangsan' THEN<br> count<br> ELSE<br> 0<br> END 'zhangsan' ,<br> CASE<br> WHEN NAME = 'lisi' THEN<br> count<br> ELSE<br> 0<br> END 'lisi'<br> FROM<br> x_table<br> ) s<br>GROUP BY<br> <a target="_blank" href="http://s.date" rel="nofollow noopener">s.date</a>;<br><br><br>

![]( )

是变成’20181018’ | ( 100,120 ) | 220

应该是可以的,你试一下

要用到子查询,子查询的条数和要 count 的 name 的个数相关,所以你这个需求仍然需要多条 sql 完成。追求一个 sql 毫无意义。

( 100,120 )换成 name+数据的字典格式

应该能行 数据也能提取出来

#8 补充格式好看了一些

厉害了

Select
Date date,
Sum(case when name=‘ laowang ’ then count else 0 end) count1,
Sum(…) count2,
Sum(…)+Sum(…) count1and2
From
X_table
Group by
Date

没必要搞子查询

额.好吧,其实意思是一样的,我也脑残了

db 只作它本职工作不好么?简单直接高效取出素材数据就好。

如何拼装输出,让 db 之上的应用层代码去作有何不可?

lateral view explode 了解下

磊哥 加波好友撒

回到顶部