【问题标题】:How can I fabricate this data in SQL query如何在 SQL 查询中伪造这些数据
【发布时间】:2015-02-09 13:52:06
【问题描述】:

我对如何从查询中获取此表感到困惑

+-------------+---------+----------+---------+-------+
|Product Name |Today    |WTD       | MTD     |YTD    |
+-------------+---------+----------+---------+-------+
|Name1        |78       |80        |89       |89     |
+-------------+---------+----------+---------+-------+
|Name2        |56       |78        |88       |78     |
+-------------+---------+----------+---------+-------+

其中的值是平均值,“Today”是今天的平均值,“WTD”是指本周至今的平均值,“MTD”是指本月至今的平均值,“YTD”是指年初至今的平均值。

老实说,我不太了解 SQL,而且我正在使用 SQLALchemy(我也不太了解)。 我要从中获取数据的表是:

class Product(Base):
    __tablename__ = 'product'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(80))

class ProductAssessment(Base):
    __tablename__ = "product_assessment"
    id = Column(Integer, primary_key=True)
    product_id = Column(Integer, ForeignKey('product.id'), nullable=False)
    product_name = relationship(Product, backref=backref('assessments'),
                   cascade="all, delete, delete-orphan")
    score = Column(Integer, nullable=False)
    record_date = Column(Datetime, default=func.now())

目前我能够通过这样做获得产品的平均值:

result = DBSession.query(Product.name.label("Product name"), func.avg(Product_Assessment.score).label("YTD")).filter(Product.id==Product_Assessment.product_id).group_by(Product.name)

如果有人可以帮助我,我将不胜感激

编辑

样本数据: 产品

+-------+--------+
|id     |name    |
+-------+--------+
|1      |Name1   |
+-------+--------+
|2      |Name2   |
+-------+--------+

产品_评估

+----------+---------+--------+----------+
|product_id|id       |score   |Date      |
+----------+---------+--------+----------+
|1         |1        |80.16   |2015/1/5  |
+----------+---------+--------+----------+
|2         |2        |85.19   |2015/1/18 |
+----------+---------+--------+----------+
|1         |3        |81.70   |2015/1/18 |
+----------+---------+--------+----------+
|1         |4        |70.11   |2015/1/18 |
+----------+---------+--------+----------+

预期输出:

+------------+--------+-------+-------+------+
|Product name|Today   |WTD    |MTD    |YTD   |
+------------+--------+-------+-------+------+
|Name1       |70.11   |70.11  |77.32  |77.32 |
+------------+--------+-------+-------+------+
|Name2       |85.19   |85.19  |85.19  |85.19 |
+------------+--------+-------+-------+------+

这是@mandeep_m19 的数据

【问题讨论】:

  • 发布您期望的示例数据集和示例输出

标签: python mysql sql sqlalchemy


【解决方案1】:

在上一个答案的基础上,我宁愿使用INNER JOIN。我确实同意CASE WHEN 的构造,但是由于每个值要考虑的行数不同,我们需要自己计算平均值(AVG 不起作用)。这是一个相当沉重的结构,但我没有看到任何更简单的东西。

SELECT 
   P.name
   ,SUM(CASE WHEN PA.record_date = <todays date> THEN PA.score ELSE 0 END) 
   / SUM(CASE WHEN PA.record_date = <todays date> THEN 1 ELSE 0 END) AS today
   ,SUM(CASE WHEN PA.record_date BETWEEN <start date> AND <end date> THEN PA.score ELSE 0 END) 
   / SUM(CASE WHEN PA.record_date BETWEEN <start date> AND <end date> THEN 1 ELSE 0 END) AS wtd
   ,SUM(CASE when PA.record_date BETWEEN <start date> AND <end date> THEN PA.score ELSE 0 END)
   / SUM(CASE WHEN PA.record_date BETWEEN <start date> AND <end date> THEN 1 ELSE 0 END) AS mtd
   ,SUM(CASE WHEN PA.record_date BETWEEN <start date> AND <end date> THEN PA.score ELSE 0 END)
   / SUM(CASE WHEN PA.record_date BETWEEN <start date> AND <end date> THEN 1 ELSE 0 END) AS ytd
FROM product P
INNER JOIN product_assessment PA
ON (P.id = PA.product_id)
GROUP BY P.name;

【讨论】:

  • 你能在子查询中做同样的事情吗?
  • 您可以使用子查询来计算总和,但不会影响性能。为什么要子查询?如果是为了简化代码,你也可以在前面定义一个函数。
【解决方案2】:

在普通 SQL 中,您可以像这样实现相同的效果(相应地指定日期):

select product.name
, avg(case when product_assessment.record_date = <todays date> then product_assessment.score else 0 end) as today
, avg(case when product_assessment.record_date between <start date> and <end date> then product_assessment.score else 0 end) as wtd
, avg(case when product_assessment.record_date between <start date> and <end date> then product_assessment.score else 0 end) as mtd
, avg(case when product_assessment.record_date between <start date> and <end date> then product_assessment.score else 0 end) as ytd
from product, product_assessment
where product.id = product_assessment.product_id
group by product.name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多