2017-07-10 4 views
0

私は新しい午前中にデータを追加します。参加とMySQLとSQLAlchemyのにSQLとSQLAlchemyの

のでSubquery_Aは〜私の形で千件の結果を与える:

[(customer_id, transaction_id)...] 

Subquery_Aが30より大きい "days_a_customer" 値と顧客IDを表します

[(customer_id, days_a_customer)...] 

Subquery_Bは〜私に形30,000結果が得られますSubquery_Bは、すべての顧客のトランザクションイベントを表します。

私はsubquery_Aで「CUSTOMER_ID」の値だけでなく、subquery_Aすなわちから「days_a_customer」を持っているsubquery_B内のすべての行を取得するようにどのように私は、これら2つのサブクエリをマージすることができます:Subquery_Cがすべてを表し

Subquery_C = [(customer_id, transaction_id, days_a_customer)...] 

30日を超えている顧客によって実行されたトランザクションイベント。

SQLAlchemyの固有のヘルプが好ましいが、生SQLも大幅に高く評価されるだろう。

答えて

1

あなたの質問に基づいて、私はあなたが欲しい推測しています:30日以上の顧客であり、 トランザクションを持っている

  • お客様を。

すべてのお客様が一つのテーブルであり、トランザクションが別のテーブルにあります。この質問を満たすために、customersテーブルとtransactionsテーブルの内部結合(両方のテーブルのレコードのみを返す)とフィルターメソッドを使用して、顧客としての日数をフィルターに掛けることができます。このメソッドは、次の例に示されています。

from sqlalchemy import Column, Integer, String, DateTime 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy.orm import sessionmaker, relationship 
from random import randint 

Base = declarative_base() 


## Define sample models 


class Customer(Base): 
    __tablename__ = 'customer' 
    customer_id = Column('id', Integer, primary_key=True) 
    nr_days_customer = Column('nr_days_customer', Integer) 
    name = Column('name', String(250)) 
    transaction = relationship('Transaction', back_populates='customer') 

    def __init__(self, nr_days_customer, name): 
     self.nr_days_customer = nr_days_customer 
     self.name = name 

    def __repr__(self): 
     return '[{customer_id}] - {name} - {nr_days_customer} days'.format(customer_id=self.customer_id, 
                      name=self.name, 
                      nr_days_customer=self.nr_days_customer) 


class Transaction(Base): 
    __tablename__ = 'transaction' 
    transaction_id = Column('id', Integer, primary_key=True) 
    customer_id = Column('customer_id', Integer, ForeignKey('customer.id')) 
    name = Column(String(250)) 
    customer = relationship('Customer', back_populates='transaction') 

    def __init__(self, customer_id, name): 
     self.customer_id = customer_id 
     self.name = name 

    def __repr__(self): 
     return '[{transaction_id}] {name} - customer: {customer_id}'.format(transaction_id=self.transaction_id, 
                      name=self.name, 
                      customer_id=self.customer_id) 


engine = create_engine('sqlite:///') 
session = sessionmaker() 
session.configure(bind=engine) 
ex_ses = session() 
Base.metadata.create_all(engine) 

## Create sample data 

# http://listofrandomnames.com/ for something else then A,B,... 
names = ['Virgil', 'Ina', 'Oleta', 'Suzette', 'Usha', 'Ilda', 'Lorean', 'Cinthia', 'Sheba', 'Waneta', 'Donnette', 
     'Minerva', 'Owen', 'Georgia', 'Gertrudis', 'Sherika', 'Terry', 'Deja', 'Regena', 'Carolin'] 

# Create customers > 30 days with transaction 
for customer_nr in range(5): 
    ex_ses.add(Customer(name=names[customer_nr].format(customer_nr), 
         nr_days_customer=randint(30, 120))) 

# Create customers < 30 days with transaction 
for customer_nr in range(5): 
    ex_ses.add(Customer(name=names[customer_nr + 5].format(customer_nr), 
         nr_days_customer=randint(0, 29))) 

# Create customers > 30 days without transaction 
for customer_nr in range(5): 
    ex_ses.add(Customer(name=names[customer_nr + 10].format(customer_nr), 
         nr_days_customer=randint(30, 120))) 

# Create customers < 30 days without transaction 
for customer_nr in range(5): 
    ex_ses.add(Customer(name=names[customer_nr + 15].format(customer_nr), 
         nr_days_customer=randint(0, 29))) 

# Create transactions 
for transaction_nr in range(10): 
    ex_ses.add(Transaction(name='Transaction {}'.format(transaction_nr), customer_id=transaction_nr + 1)) 

ex_ses.commit() 

# Queries 
print('customers:') 
for customer in ex_ses.query(Customer).all(): 
    print('* ', customer) 

''' 
customers: 
* [1] - Virgil - 113 days 
* [2] - Ina - 112 days 
* [3] - Oleta - 44 days 
* [4] - Suzette - 61 days 
* [5] - Usha - 82 days 
* [6] - Ilda - 10 days 
* [7] - Lorean - 14 days 
* [8] - Cinthia - 24 days 
* [9] - Sheba - 25 days 
* [10] - Waneta - 11 days 
* [11] - Donnette - 38 days 
* [12] - Minerva - 110 days 
* [13] - Owen - 98 days 
* [14] - Georgia - 68 days 
* [15] - Gertrudis - 36 days 
* [16] - Sherika - 18 days 
* [17] - Terry - 6 days 
* [18] - Deja - 7 days 
* [19] - Regena - 21 days 
* [20] - Carolin - 14 days 
''' 

print('Transactions:') 
for transaction in ex_ses.query(Transaction).all(): 
    print('* ', transaction) 

''' 
Transactions: 
* [1] Transaction 0 - customer: 1 
* [2] Transaction 1 - customer: 2 
* [3] Transaction 2 - customer: 3 
* [4] Transaction 3 - customer: 4 
* [5] Transaction 4 - customer: 5 
* [6] Transaction 5 - customer: 6 
* [7] Transaction 6 - customer: 7 
* [8] Transaction 7 - customer: 8 
* [9] Transaction 8 - customer: 9 
* [10] Transaction 9 - customer: 10 
''' 


''' 
-- using inner join only records in both tables are being returned 
-- https://www.w3schools.com/sql/sql_join.asp 
-- condition on more then 30 days 
-- untested SQL: 
SELECT customer.customer_id, transaction.transaction_id, customer.days_a_customer from customer 
INNER JOIN transaction ON customer.customer_id = transaction.customer_id 
WHERE customer.days_a_customer > 30 AND customer.customer_id. 
''' 

print('Customer - transactions:') 
for cust_trans in ex_ses.query(Customer.name, Customer.nr_days_customer,Transaction.transaction_id).join(Transaction).filter(
     Customer.nr_days_customer > 30).all(): 
    print('* Customer {customer_name} - {nr_days_customer} --> transaction {transaction_id}'.format(
     customer_name = cust_trans[0],nr_days_customer=cust_trans[1],transaction_id=cust_trans[2])) 

''' 
Customer - transactions: 
* Customer Virgil - 113 --> transaction 1 
* Customer Ina - 112 --> transaction 2 
* Customer Oleta - 44 --> transaction 3 
* Customer Suzette - 61 --> transaction 4 
* Customer Usha - 82 --> transaction 5 
''' 

あなたが唯一の30日以上の顧客であり、トランザクションテーブルにある5人の顧客は、このクエリによって返されるコメントテキストで見ることができるように。

私は、上記の例ではMySQLを使用していませんよ。私は、提供されたサンプルがmysqlを使って簡単にセットアップに適用できると信じています。

さらにご質問がある場合はコメントしてください。

関連する問題