2016-06-16 1 views
0

그래서 나는 다음과 같은 반환하는 데 필요한 논리를 오는에 약간 붙어입니다 :SQLAlchemy의 쿼리

여기
+--------------+------------+------------+------------+ 
| Product Name | 2016-05-10 | 2016-05-11 | 2016-05-12 | 
+--------------+------------+------------+------------+ 
| Big Chair | 29.00 | 78.00 | 900.00 | 
+--------------+------------+------------+------------+ 
| Small Chair | 11.00 | 65.00 | 12.00 | 
+--------------+------------+------------+------------+ 
| Box of bees | 5.00 | 20.00 | 80.00 | 
+--------------+------------+------------+------------+ ... 

는 왜 - 내 현재 설정 SQLAlchemy의의 models.py 파일은 (당신이 최적이 아닌 발견하면 나에게 벽돌을 던지는 삼가 해 주시기 바랍니다 ..)된다

class Sale(db.Model): 
    __tablename__ = 'sales' 
    id = Column(Integer, primary_key=True) 
    sale_date = Column(DateTime) 
    total_price = Column(Numeric(12, 2), default=0) 
    products = relationship('Product', secondary='sale_product') 

class Product(db.Model): 
    __tablename__ = 'products' 
    id = Column(Integer, primary_key=True) 
    name = Column(Text) 
    price = Column(Numeric(12, 2), default=0) 
    sales = relationship('Sale', secondary='sale_product') 


class SaleProduct(db.Model): 
    __tablename__ = 'sale_product' 
    sale_id = Column(Integer, ForeignKey('sales.id'), primary_key=True) 
    product_id = Column(Integer, ForeignKey('products.id'), primary_key=True) 
    product_quantity = Column(Numeric(12, 1), default=0) 
    sale = relationship('Sale', backref=backref("sale_assoc")) 
    product = relationship('Product', backref=backref("product_assoc")) 

내가 또는 위의 결과를 반환하는 쿼리 마련하기 위해 고군분투하지만 보다 구체적으로는, 그런 다음 그 결과를 얻기 위해 사용할 수 있습니다. 파이썬을 사용하여 처리 할 때 "해킹"할 수는 있지만 포스트그레스가 무거운 작업을 수행하는 것이 더 효율적이라고 생각합니다.

여기에 지금까지 내 생각을이다 :

I에 의해 제품을 (??) 기준점으로 SaleProduct를 사용하여 다음 그룹에 SQLAlchemy의 요청하면서 어떻게 든 제품과 판매 테이블에 가입하여 시작해야합니다

이름 (이 경우에는 이름이 항상 고유하므로 두 제품의 이름이 동일하지 않습니다.) 하지만 내가 만났던 문제는 이미 그룹화 된 제품을 조인하여 각 그룹에 대해 비용을 합한 다음 날짜가있는 열로 구분하는 방법을 파악하려고 할 때입니다.

  1. 나는 심지어 포스트 그레스 또는 SQL 연금술을 사용하여 상단 예를 들어 출력을 얻을 수 있습니다

    는 명확하게하려면 ?

  2. 제가 생각하기에 전체 거래가 실제로 복잡합니까? 내가 여기서 무엇을 놓치고 있니?
  3. 마지막으로 이러한 결과를 처음으로 반환하는 방법을 얻는 최선의 방법은 무엇입니까? 데이터베이스에서 원시 데이터를 가져온 다음 파이썬을 사용하여 조작하는 것이 더 낫습니다 (예 : dicts 또는 목록으로 반환 한 다음 인쇄를 위해 "행"출력). 아니면 해당 작업에 데이터베이스 자체를 사용해야합니까?
  4. 매우 건방한 사람이지만 여가 시간이 있다면, 이것이 일하는 방법에 대한 실물 모형 (매우 작은 규모의)을 제공 할 수 있습니까? - 필수는 아니지만 가능한 경우 구현을 선택하는 것이 좋습니다.

미리 감사드립니다.

답변

1

누락 된 부분은 crosstab ("피봇 테이블")입니다. 열의 값을 여러 열로 바꿀 수 있습니다.

하자 작업을 뒤로하고 우리는 우리에게 우리가 원하는 결과를 제공하기 위해 crosstab에 제공하는 데 필요한 데이터를 가지고 올 :

+--------------+------------+----------------+ 
| Product Name | Sale Date | Total Quantity | 
+--------------+------------+----------------+ 
| Big Chair | 2016-05-10 | 29.00   | 
+--------------+------------+----------------+ 
| Big Chair | 2016-05-11 | 78.00   | 
+--------------+------------+----------------+ 
| Big Chair | 2016-05-12 | 900.00   | 
+--------------+------------+----------------+ 
| Small Chair | 2016-05-10 | 11.00   | 
+--------------+------------+----------------+ 
| Small Chair | 2016-05-11 | 65.00   | 
+--------------+------------+----------------+ 
| Small Chair | 2016-05-12 | 12.00   | 
+--------------+------------+----------------+ 
| Box of Bees | 2016-05-10 | 5.00   | 
+--------------+------------+----------------+ 
| Box of Bees | 2016-05-11 | 20.00   | 
+--------------+------------+----------------+ 
| Box of Bees | 2016-05-12 | 80.00   | 
+--------------+------------+----------------+ 
우리가 우리에게 그것을 제공하기 위해 작성하는 일 쿼리

?

SELECT 
    products.name, 
    sale_date::date, 
    sum(product_quantity) 
FROM 
    sales 
    JOIN sale_product ON sales.id = sale_id 
    JOIN products ON product_id = products.id 
GROUP BY products.name, sale_date::date 

이제 우리는 날짜에 테이블을 선회해야합니다 쉽고, 세 개의 테이블과 GROUP BY 판매 제품과 날짜를 가입 할 수 있습니다.

SELECT * FROM crosstab($$ <the previous query> $$, $$ SELECT DISTINCT sale_date::date FROM sales ORDER BY sale_date::date DESC LIMIT 3 $$) 
AS sales_numbers(product_name text, today int, yesterday int, ereyesterday int); 

제한 사항은 열, 특히 열 수를 미리 정의해야한다는 것입니다. 동적 열을 가져 오려면 EXECUTE 동적으로 생성 된 쿼리를 사용할 수 있습니다. 물론 유연성을 극대화하려면 Python에서 피벗을 수행 할 수 있지만 SQL, IMO에서는 피벗을 수행하는 것이 약간 더 효율적입니다.

SQLAlchemy에서 이것을 사용하는 것은 독자의 연습 과제로 남겨 둡니다.

+0

답변 해 주셔서 감사합니다. 나는이 정보를 가지고 있기 때문에이 대답을 받아 들일 것이다. 나는 이것이 앞으로 어떻게 작동하는지 파고 들기에 충분한 정보를 가지고 있기 때문이다. 매우 유익한. 건배. – Meh