52 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import asyncio
 | 
						|
 | 
						|
from sqlalchemy import select, func, union
 | 
						|
from sqlalchemy.ext.asyncio import AsyncSession
 | 
						|
from sqlalchemy.orm import joinedload
 | 
						|
 | 
						|
from backend.session import session_maker
 | 
						|
from models import Deal, DealProduct, Service
 | 
						|
 | 
						|
import models
 | 
						|
import models.secondary
 | 
						|
 | 
						|
 | 
						|
async def main(session: AsyncSession):
 | 
						|
    deal_services_subquery = (
 | 
						|
        select(
 | 
						|
            models.secondary.DealService.deal_id,
 | 
						|
            func.sum(models.secondary.DealService.quantity * Service.price).label('total_price')
 | 
						|
        )
 | 
						|
        .join(Service)
 | 
						|
        .group_by(models.secondary.DealService.deal_id)
 | 
						|
    )
 | 
						|
    product_services_subquery = select(
 | 
						|
        select(
 | 
						|
            models.secondary.DealProductService.deal_id,
 | 
						|
            func.sum(models.DealProduct.quantity * models.secondary.DealProductService.price).label('total_price')
 | 
						|
        )
 | 
						|
        .join(models.secondary.DealProduct)
 | 
						|
        .group_by(models.secondary.DealProductService.deal_id)
 | 
						|
        .subquery()
 | 
						|
    )
 | 
						|
    union_subqueries = deal_services_subquery.union(product_services_subquery).subquery()
 | 
						|
    final_subquery = (
 | 
						|
        select(
 | 
						|
            union_subqueries.c.deal_id,
 | 
						|
            func.sum(union_subqueries.c.total_price).label('total_sum')
 | 
						|
        )
 | 
						|
        .group_by(union_subqueries.c.deal_id)
 | 
						|
        .subquery()
 | 
						|
    )
 | 
						|
 | 
						|
    print(final_subquery)
 | 
						|
 | 
						|
 | 
						|
async def preload():
 | 
						|
    async with session_maker() as session:
 | 
						|
        await main(session)
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    asyncio.run(preload())
 |