1

嗨,我有一个存储反馈和评级的表格(1 到 5 之间)

我什至不知道这是否可以用 SQL 完成。

想要我做什么是按月分组并将所有 Q1、Q2、Q3 和 Q4 加到一列中。在另一列中具有该分组月份中的记录数量。

然后我可以使用 PHP 计算出那几个月的平均费率。

  unixStamp      |  Q1   |   Q2   |   Q3    |   Q4
-----------------------------------------------------
  1362149504     |  5    |    4   |    3    |   5
  1362136774     |  5    |    5   |    2    |   5
  ..........     |  ...  |  ....  |  ....   |  ....

这是我想要实现的。

  Mnth           |  score  |   count  | 
---------------------------------------
  1              |  192    |    20    | 
  2              |  365    |    40    | 
  ..........     |  ...    |  ....    |  
4

2 回答 2

2

您可以使用 aCROSS JOIN取消透视数据以获取结果:

SELECT Mnth,
  sum(data) score,
  count(data) `count`
FROM 
(
  SELECT MONTH(FROM_UNIXTIME(unixStamp)) Mnth, 
    CASE q.col
      WHEN 'Q1' THEN Q1
      WHEN 'Q2' THEN Q2
      WHEN 'Q3' THEN Q3
      WHEN 'Q4' THEN Q4
    END AS DATA
  FROM yourtable t
  CROSS JOIN 
  (
    SELECT 'Q1' AS col
    UNION ALL SELECT 'Q2'
    UNION ALL SELECT 'Q3'
    UNION ALL SELECT 'Q4'
  ) q
) s
group by Mnth

请参阅带有演示的 SQL Fiddle

于 2013-03-01T16:47:32.143 回答
1

GROUP BY可以包含任意表达式(或表达式的别名)SELECT,并且您可以SUM()将 4 个季度列一起作为聚合。

SELECT
  /* Retrieve only the month from unixStamp */
  MONTH(FROM_UNIXTIME(unixStamp)) AS Mnth,
  /* SUM() as an aggregate the 4 quarterly cols */
  SUM(Q1+Q2+Q3+Q4) AS score,
  /* COUNT(*) aggregate will list number of records for group */
  COUNT(*) AS `count`
FROM yourtable
GROUP BY Mnth

请注意,以上将按月份分组,而不是似乎更合适的月份/年份组合。如果你需要,使用类似的东西

/* Supplies month like 2013-02 */
SELECT
  DATE_FORMAT(FROM_UNIXTIME(unixtimestamp), '%Y-%m') AS Mnth,
  ...
于 2013-03-01T16:41:45.293 回答