數(shù)據(jù)庫是 oracle 11g。項目是 flask。
有這樣兩個表:
我想查詢出這樣一個表格
序號 | 部門 | 角色 | 員工 | 電話 | 月份 | 管戶數(shù) | 本月管戶總余額 | 上月管戶總余額 | 新增余額 |
---|
其中 管戶數(shù)
是員工當(dāng)月所關(guān)聯(lián)的用戶的總數(shù),本月管戶總余額
是當(dāng)月所關(guān)聯(lián)的用戶的余額總數(shù),上月管戶總余額
是上月所關(guān)聯(lián)的用戶的余額總額,新增余額
是本月管戶總余額
減去 上月管戶總余額
。
本人使用下面的 sqlalchemy 寫法是可以查詢出來的:
sbq = db.session.query(OusiStaff.department, OusiStaff.role, OusiStaff.name.label('staff_name'),
g1.staff_phone, g1.name.label('guest_name'), g1.month, g1.balance,
g2.balance.label('last_balance')).filter(
OusiStaff.phone == g1.staff_phone, g1.staff_phone == g2.staff_phone,
OusiStaff.phone == current_user.phone, g1.name==g2.name,
func.add_months(func.to_date(g1.month, 'yyyy-mm'), -1) == func.to_date(g2.month, 'yyyy-mm')
).subquery()
database = db.session.query(sbq.c.department, sbq.c.role, sbq.c.staff_name, sbq.c.staff_phone, sbq.c.guest_name,
sbq.c.month, func.sum(sbq.c.balance), func.sum(sbq.c.last_balance)). \
filter(sbq.c.month == date.today().strftime('%Y-%m')).group_by(sbq.c.department, sbq.c.role,
sbq.c.staff_name, sbq.c.staff_phone,
sbq.c.guest_name,
sbq.c.month)
但是,這里有一個問題,那就是 數(shù)據(jù)庫里的數(shù)據(jù)是從 “2018-01” 這個月份開始,要是查詢 “2018-01” 當(dāng)月的情況的話,由于沒有上月余額的數(shù)據(jù),那么 “2018-01” 這個余額就無法顯示數(shù)據(jù)。
我的理想結(jié)果是,查詢 “2018-01” 當(dāng)月的數(shù)據(jù)的時候,能夠顯示,并且把上月的余額設(shè)置為 0 。
這個用 sqlalchemy 該如何寫?萬分感謝。
努力了一天,終于測試出來了。
sbq = db.session.query(OusiStaff.department, OusiStaff.role, OusiStaff.name.label('staff_name'),
g1.staff_phone, g1.name.label('guest_name'), g1.month, g1.balance,
func.nvl(db.session.query(g2.balance).filter(
g1.name == g2.name,
func.add_months(func.to_date(g1.month, 'yyyy-mm'), -1) == func.to_date(g2.month,
'yyyy-mm')
), 0).label('last_balance')).filter(
OusiStaff.phone == g1.staff_phone,
OusiStaff.phone == current_user.phone
).group_by(OusiStaff.department, OusiStaff.role, OusiStaff.name.label('staff_name'),
g1.staff_phone, g1.name.label('guest_name'), g1.month, g1.balance).subquery()
database = db.session.query(sbq.c.department, sbq.c.role, sbq.c.staff_name, sbq.c.staff_phone,
sbq.c.month, func.count(sbq.c.guest_name).label('members'),
func.sum(sbq.c.balance).label('balance'),
func.sum(sbq.c.last_balance).label('last_balance')). \
filter(sbq.c.month == date.today().strftime('%Y-%m')).group_by(sbq.c.department, sbq.c.role,
sbq.c.staff_name, sbq.c.staff_phone,
sbq.c.month)
其中的難點一是利用 func.to_date
和 func.add_months
對上個月這個時間進(jìn)行關(guān)聯(lián)查詢(凡是數(shù)據(jù)庫支持的函數(shù),在 sqlalchemy 中都可以使用 func 加函數(shù)名來操作。),二是利用 func.nvl
函數(shù)來對初始化數(shù)據(jù)進(jìn)行賦值 0 的操作。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。