2013-03-01 36 views
1

嗨,我有其中存储的反馈和评分表(1之间和5)集团按月并添加多个COLS

我甚至不知道这是否可以用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 | 
    ..........  | ... | .... | 
+0

我想你应该采取的unixStamp并从中获取月份。 'score'是未知的:-D和'count'是Q1 + ... + Q4 – 2013-03-01 16:40:14

回答

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, 
    ... 
+0

这就是我想要的。非常感谢。 – 2013-03-01 16:50:23

+0

@DavidAllen乐于助人。 – 2013-03-01 16:51:50

+0

我知道这是不可以的问题,你可以将SUM(response_time + friendlyliness + quality_service + value_money)AS分数替换为COUNTIF(response_time + friendlyliness + quality_service + value_money> 15)AS分数 - 给出超过15的评分数 – 2013-03-01 16:51:50

2

可以使用CROSS JOINunpivot的的数据得到的结果:

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 with Demo

+0

将堆栈溢出转移到更明亮的明天。 – Zane 2013-03-01 18:17:32