2013-03-01 35 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