Sql 越过这个,我不得不不同意你的平均值()。如果该表有100行,那么对于close_5,您将得到平均5个价格和95个零-肯定不是期望的输出。如果你用SUM(c.close*c.is_5)/SUM(c.is_5)替换平均值,它应该会起作用@ivancho:谢谢,

Sql 越过这个,我不得不不同意你的平均值()。如果该表有100行,那么对于close_5,您将得到平均5个价格和95个零-肯定不是期望的输出。如果你用SUM(c.close*c.is_5)/SUM(c.is_5)替换平均值,它应该会起作用@ivancho:谢谢,,sql,mysql,Sql,Mysql,越过这个,我不得不不同意你的平均值()。如果该表有100行,那么对于close_5,您将得到平均5个价格和95个零-肯定不是期望的输出。如果你用SUM(c.close*c.is_5)/SUM(c.is_5)替换平均值,它应该会起作用@ivancho:谢谢,你完全正确。你的建议很有意义,因此我在编辑后的答案中使用了它,添加了一个案例,以避免在请求的时间段内找不到任何记录的情况下被0分割。实际上,对于没有记录的情况,0不是理想的返回值-对于价格来说,它是可以的,但是如果平均值真的可以是0呢?我可能会


越过这个,我不得不不同意你的平均值()。如果该表有100行,那么对于close_5,您将得到平均5个价格和95个零-肯定不是期望的输出。如果你用SUM(c.close*c.is_5)/SUM(c.is_5)替换平均值,它应该会起作用@ivancho:谢谢,你完全正确。你的建议很有意义,因此我在编辑后的答案中使用了它,添加了一个
案例
,以避免在请求的时间段内找不到任何记录的情况下被
0
分割。实际上,对于没有记录的情况,0不是理想的返回值-对于价格来说,它是可以的,但是如果平均值真的可以是0呢?我可能会将其置空:SUM(c.close*c.is_5)/NULLIF(SUM(c.is_5),0)@Peter:更改了列引用,添加了distinct@Peter:更改了列引用,添加了distinct。我猜你不再使用此网站,但最好将其编辑到你的问题中。我猜你不再使用此网站了,但最好是把这个编辑成你的问题。
SELECT avg(close),
       avg(`trd_qty`) 
  FROM (SELECT *
          FROM cashmarket 
         WHERE symbol = 'hdil'
         ORDER BY `M_day` desc 
         LIMIT 0,15 ) s
SELECT
  CASE WHEN SUM(c.is_5) > 0 THEN SUM( c.close   * c.is_5 ) / SUM( c.is_5 )
       ELSE 0 END AS close_5,
  CASE WHEN SUM(c.is_5) > 0 THEN SUM( c.trd_qty * c.is_5 ) / SUM( c.is_5 )
       ELSE 0 END AS trd_qty_5,
  CASE WHEN SUM(c.is_15) > 0 THEN SUM( c.close   * c.is_15 ) / SUM( c.is_15 )
       ELSE 0 END AS close_15,
  CASE WHEN SUM(c.is_15) > 0 THEN SUM( c.trd_qty * c.is_15 ) / SUM( c.is_15 )
       ELSE 0 END AS trd_qty_15
FROM
(
  SELECT
    cashmarket.*,
    IF( TO_DAYS(NOW()) - TO_DAYS(m_day) < 15, 1, 0) AS is_15,
    IF( TO_DAYS(NOW()) - TO_DAYS(m_day) <  5, 1, 0) AS is_5
  FROM cashmarket
) c
   SELECT DISTINCT
          t.symbol,
          x.avg_5_close,
          y.avg_15_close
     FROM CASHMARKET t
LEFT JOIN (SELECT cm_5.symbol,
                  AVG(cm_5.close) 'avg_5_close',
                  AVG(cm_5.trd_qty) 'avg_5_qty'
             FROM CASHMARKET cm_5
            WHERE cm_5.m_date BETWEEN DATE_SUB(NOW(), INTERVAL 5 DAY) AND NOW()
         GROUP BY cm_5.symbol) x ON x.symbol = t.symbol
LEFT JOIN (SELECT cm_15.symbol,
                  AVG(cm_15.close) 'avg_15_close',
                  AVG(cm_15.trd_qty) 'avg_15_qty'
             FROM CASHMARKET cm_15
            WHERE cm_15.m_date BETWEEN DATE_SUB(NOW(), INTERVAL 15 DAY) AND NOW()
         GROUP BY cm_15.symbol) y ON y.symbol = t.symbol