【问题标题】:How to join the same table and calculate data in SQL alchemy如何在 SQLalchemy 中加入同一张表并计算数据
【发布时间】:2018-09-29 18:44:52
【问题描述】:

我有一张这样的表:

| id | company_name | income | year |
|----|--------------|--------|------|
| 0  | A            | 10     | 2010 |
| 1  | A            | 20     | 2011 |
| 2  | A            | 30     | 2012 |
| 3  | B            | 20     | 2010 |
| 4  | B            | 15     | 2011 |

我想得到一张这样的 A 表:

|                | 2010 | 2011 | 2012 |
|----------------|------|------|------|
| income         | 10   | 20   | 30   |
| increase_ratio | -    | 2    | 1.5  |

在 SQL 中,我可以通过使用别名和连接来获得这种结果,但是如何使用 python SQL alchemy 获得这种结果?

表的数据库是MySQL,原表的schema如下:

from sqlalchemy import MetaData, Integer, Float, String
from sqlalchemy import Table, Column

metadata = MetaData()

income = Table(
    'income', metadata,
    Column('company_id', Integer, primary_key=True),
    Column('company_name', String(255), nullable=False),
    Column('income', Float, nullable=False),
    Column('year', Integer, nullable=False),
)

【问题讨论】:

标签: python mysql sql orm sqlalchemy


【解决方案1】:

试试这个:

select 'Income' AS ` `, MAX(CASE WHEN Year= 2010 THEN income END)`2010`
  ,MAX(CASE WHEN Year= 2011 THEN income END)`2011`
  ,MAX(CASE WHEN Year= 2012 THEN income END)`2012`
from(
  SELECT A.*,(A.income/B.income)increase_ratio
  FROM My_Table A
  LEFT JOIN My_Table B ON B.id = A.id-1
  WHERE A.company_name = 'A'
  )D
 UNION
 select 'increase_ratio' AS ` `,MAX(CASE WHEN Year= 2010 THEN increase_ratio END)`2010`
  ,MAX(CASE WHEN Year= 2011 THEN increase_ratio END)`2011`
  ,MAX(CASE WHEN Year= 2012 THEN increase_ratio END)`2012`
from(
  SELECT A.*,(A.income/B.income)increase_ratio
  FROM My_Table A
  LEFT JOIN My_Table B ON B.id = A.id-1
  WHERE A.company_name = 'A'
  )D

#SQL Fiddle 中查看此内容

输出:

                2010    2011    2012
Income          10      20      30
increase_ratio  (null)  2      1.5

【讨论】:

  • 感谢这个漂亮的脚本,我会尝试将其转换为 sql alchemy 形式,看看它是否有效。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多