Paulo Aquino wrote:
> On Tue, Sep 15, 2009 at 5:53 AM, Michael Bayer
> <mike...@zzzcomputing.com>wrote:
>
>>
>> Paulo Aquino wrote:
>> > I have 2 tables 'Product' and 'ProductPrice'. I want to get all valid
>> > products, a product is valid if it has both a valid 'Selling' and
>> 'Buying'
>> > ProductPrice type. A ProductPrice is valid if the valid_from date <=
>> > date.today() and valid_to >= date.today().
>> >
>> > Product Table:
>> >
>> >  id |  sku  | principal
>> > ----+-------+-----------
>> >   1 | sku_1 | kraft
>> >   2 | sku_2 | kraft
>> >   3 | sku_3 | kraft
>> >   4 | sku_4 | kraft
>> >
>> > ProdutPrice Table:
>> >
>> >  id |  type    | sku    | principal | price  | valid_from  |  valid_to
>> >
>> ----+-----------+---------+-------------+--------+-----------------+------------
>> >   1 | Buying | sku_1 | kraft      |   122 | 2009-05-05 | 2009-12-12
>> >   2 | Buying | sku_1 | kraft      |   231 | 2010-01-01 | 2010-02-02
>> >   3 | Selling | sku_1 | kraft      |   125 | 2009-05-05 | 2009-12-12
>> >   4 | Buying | sku_2 | kraft      |   122 | 2009-05-05 | 2009-12-12
>> >   5 | Buying | sku_2 | kraft      |   231 | 2010-01-01 | 2010-02-02
>> >   6 | Selling | sku_2 | kraft      |   125 | 2009-05-05 | 2009-12-12
>> >   7 | Buying | sku_3 | kraft      |   122 | 2009-05-05 | 2009-12-12
>> >   8 | Selling | sku_4 | kraft      |   122 | 2009-05-05 | 2009-12-12
>> >
>> > Using Raw SQL here is how I did it:
>> >
>> > 1. SELECT product.id,
>> >      type,
>> >       product.sku,
>> >       product.principal,
>> >       price,
>> >       valid_from,
>> >       valid_to INTO TEMP
>> >     FROM product
>> >     INNER JOIN product_price on
>> >       product.principal = product_price.principal AND
>> >       product.sku = product_price.sku
>> >     WHERE valid_from <= current_date AND valid_to >= current_date ;
>> >
>> > 2. SELECT DISTINCT * from TEMP a , TEMP b
>> >     WHERE a.type='Selling' AND b.type='Buying'
>> >     AND a.principal = b.principal
>> >     AND a.sku = b.sku;
>> >
>> > From this two queries I now have distinct products that have a valid
>> pair
>> > of
>> > both 'Buying' and 'Selling' Price. (Those products with a valid
>> 'Buying'
>> > or
>> > 'Selling price only and not have them both are dropped)
>> >
>> >
>> > Using SQLAlchemy here is how I did it:
>> >
>> > 1. valid_price = and_(ProductPrice.sku == Product.sku,
>> > ProductPrice.principal==Product.principal,
>> >                                ProductPrice.valid_from <=
>> date.today(),
>> >                                ProductPrice.valid_to >= date.today())
>> >
>> >    valid_products =
>> > session.query(Product).join(ProductPrice).filter(valid_price)
>> >
>> > 2. Now I want to self join valid_products, same thing I did in my Raw
>> SQL
>> > solution no. 2 I've been trying but getting weird results.
>> >
>> >
>> > If someone can please help me, here's my test case
>> > http://pastebin.com/m3f8a95c8
>>
>> you can say:
>>
>> valid_products = session.query(Product,
>> ProductPrice.type).join(ProductPrice).filter(valid_price)
>>
>> a = valid_products.subquery()
>> b = valid_products.subquery()
>>
>> PA = aliased(Product, a)
>> PB = aliased(Product, b)
>>
>> q = session.query(PA, PB).\
>>            distinct().\
>>            filter(a.c.type=='Selling').\
>>            filter(b.c.type=='Buying').\
>>            filter(a.c.principal==b.c.principal).\
>>            filter(a.c.sku==b.c.sku)
>>
>
>    This works perfectly fine, but count() is wrong, seems to return a
> count
> which is more than 1 from what is expected.


dont use query.count() for queries like these.  use
query.value(func.count(<somecolumn>)).



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to