@@ -550,21 +550,30 @@ SQL::
550550 ... """)
551551
552552 >>> q_volume = q.extendedprice * (1 - q.discount)
553+ >>> q_revenue = q_volume.sum()
553554
554- >>> got = (
555- ... q.lineitem
556- ... .filter((q.partsupp.part.type == 'ECONOMY ANODIZED STEEL') &
557- ... (q.order.customer.nation.region.name == 'AMERICA') &
558- ... (q.order.orderdate >= date(1995, 1, 1)) &
559- ... (q.order.orderdate <= date(1996, 12, 31)))
560- ... .group(year=q.order.orderdate.year)
561- ... .select(
562- ... year=q.year,
563- ... mkt_share=
564- ... (q._.filter(q.partsupp.supplier.nation.name == 'CANADA') >> q_volume).sum() /
565- ... (q._ >> q_volume).sum()
555+ >>> q_nation_market_share = lambda market_region, supp_nation, q_part, start, end: (
556+ ... q.lineitem
557+ ... .filter((q.partsupp.part >> q_part) &
558+ ... (q.order.customer.nation.region.name == market_region) &
559+ ... (q.order.orderdate >= start) &
560+ ... (q.order.orderdate <= end))
561+ ... .group(year=q.order.orderdate.year)
562+ ... .select(
563+ ... year=q.year,
564+ ... mkt_share=
565+ ... (q._ >> q.filter(q.partsupp.supplier.nation.name == supp_nation) >> q_revenue) /
566+ ... (q._ >> q_revenue)
567+ ... )
566568 ... )
567- ... .run())
569+
570+ >>> got = q_nation_market_share(
571+ ... market_region='AMERICA',
572+ ... supp_nation='CANADA',
573+ ... start=date(1995, 1, 1),
574+ ... end=date(1996, 12, 31),
575+ ... q_part=q.type == 'ECONOMY ANODIZED STEEL',
576+ ... ).run()
568577
569578 >>> got == expected
570579 True
@@ -613,12 +622,10 @@ Product Type Profit Measure Query (Q9)
613622
614623::
615624
616- >>> q_amount = (
617- ... q.extendedprice * (1 - q.discount) -
618- ... q.partsupp.supplycost * q.quantity
619- ... )
625+ >>> q_volume = q.extendedprice * (1 - q.discount)
626+ >>> q_amount = q_volume - q.partsupp.supplycost * q.quantity
627+ >>> q_sum_profit = q_amount.sum()
620628
621- ::
622629
623630 >>> got = (
624631 ... q.lineitem
@@ -631,7 +638,7 @@ Product Type Profit Measure Query (Q9)
631638 ... .select(
632639 ... nation=q.nation,
633640 ... year=q.year,
634- ... sum_profit=q._ >> q_amount >> q.sum()
641+ ... sum_profit=q._ >> q_sum_profit
635642 ... )
636643 ... ).run()
637644
@@ -690,6 +697,8 @@ Returned Item Reporting Query (Q10)
690697 ... limit 20
691698 ... """)
692699
700+ Returned items::
701+
693702 >>> q_returned = (
694703 ... q.order
695704 ... .filter((q.orderdate >= date(1993, 10, 1)) &
@@ -698,12 +707,16 @@ Returned Item Reporting Query (Q10)
698707 ... .filter(q.returnflag == "R")
699708 ... )
700709
710+ >>> q_volume = q.extendedprice * (1 - q.discount)
711+ >>> q_revenue = q_volume.sum()
712+ >>> q_returned_revenue = q_returned >> q_revenue
713+
701714 >>> got = (
702715 ... q.customer
703716 ... .select(
704717 ... id=q.id,
705718 ... name=q.name,
706- ... revenue=q_returned >> (q.extendedprice * (1 - q.discount)) >> q.sum() ,
719+ ... revenue=q_returned_revenue ,
707720 ... acctbal=q.acctbal,
708721 ... nation=q.nation.name,
709722 ... address=q.address,
@@ -919,18 +932,20 @@ Promotion Effect Query (Q14)
919932 ... and l.shipdate < date '1995-10-01'
920933 ... """)
921934
922- ::
935+ Volume and revenue, total and promo-related ::
923936
924937 >>> q_volume = q.extendedprice * (1 - q.discount)
938+ >>> q_revenue = q_volume.sum()
939+ >>> q_promo_revenue = q.filter(q.partsupp.part.type.like('PROMO%')) >> q_revenue
940+
941+ Compute promotion effect::
925942
926943 >>> got = (
927944 ... q.lineitem
928- ... .filter((q.shipdate >= date(1995, 9, 1)) & (q.shipdate < date(1995, 10, 1)))
929- ... .group() >> (
930- ... 100 *
931- ... (q._.filter(q.partsupp.part.type.like('PROMO%')) >> q_volume >> q.sum()) /
932- ... (q._ >> q_volume >> q.sum())
933- ... )
945+ ... .filter(q.shipdate >= date(1995, 9, 1))
946+ ... .filter(q.shipdate < date(1995, 10, 1))
947+ ... .group()
948+ ... >> (100 * (q._ >> q_promo_revenue) / (q._ >> q_revenue))
934949 ... ).run()
935950
936951 >>> got == expected[0]['promo_revenue']
@@ -979,25 +994,33 @@ Top Supplier Query (Q15)
979994 ... s.id;
980995 ... """)
981996
982- ::
997+ Volume ::
983998
984- >>> q_total_revenue = (
985- ... q.partsupp.lineitem
986- ... .filter((q.shipdate >= date(1996, 1, 1)) & (q.shipdate < date(1996, 4, 1)))
987- ... >> (q.extendedprice * (1 - q.discount))
988- ... >> q.sum()
999+ >>> q_volume = q.extendedprice * (1 - q.discount)
1000+
1001+ Total supplier revenue from ``start `` till ``end `` dates::
1002+
1003+ >>> q_total_revenue = lambda start, end: (
1004+ ... q.partsupp
1005+ ... .lineitem
1006+ ... .filter(q.shipdate >= start)
1007+ ... .filter(q.shipdate < end)
1008+ ... >> q_volume.sum()
9891009 ... )
9901010
1011+ Compute top supplier by total revenue for specified dates::
1012+
9911013 >>> got = (
9921014 ... q.supplier
9931015 ... .select(
9941016 ... id=q.id,
9951017 ... name=q.name,
9961018 ... address=q.address,
9971019 ... phone=q.phone,
998- ... total_revenue=q_total_revenue,
1020+ ... total_revenue=q_total_revenue(start=date(1996, 1, 1), end=date(1996, 4, 1)) ,
9991021 ... )
1000- ... .filter(q.total_revenue == (q.around() >> q.total_revenue >> q.max()))
1022+ ... .filter(q.total_revenue == q.around().total_revenue.max())
1023+ ... .sort(q.id)
10011024 ... ).run()
10021025
10031026 >>> got == expected
0 commit comments