1

私はmysqlを初めて使用します。

クリック数、期間(日付)で調査しています。今、私は次のように、1か月あたりのクリック数を調べる必要があります。

MON  CLICKS
nov  0 
oct  34 
sep  67 
aug  89

私は次のようなコードを使用しました:

select MONTHNAME(period) mon,  IFNULL(count(id),0) as Clicks
from survey
where period > DATE_SUB(now(), INTERVAL 3 MONTH)
group by EXTRACT(MONTH FROM period)

レコードがない場合は機能しません。

ここで、その月にレコードがないと思う1つのことは、0を表示する必要があります。novクリック数にレコードがない場合は、である必要があります0

my table structure was like this 
CREATE TABLE `survey` (
  `id` int(2) NOT NULL auto_increment,
   `period` datetime default NULL)

過去4週間私は使用しました

 SELECT uq.timespan, COALESCE(tsq.TotalClicks, 0) as Clicks FROM (
SELECT '22-28 days' as timespan
union SELECT '15-21 days'
union SELECT '8-14 days'
union SELECT 'up to 7 days'

)uq LEFT JOIN (
SELECT CASE 
    WHEN submitdate >= NOW() - INTERVAL 4 WEEK
                AND submitdate < NOW() - INTERVAL 3 WEEK THEN '22-28 days'
    WHEN submitdate >= NOW() - INTERVAL 3 WEEK
           AND submitdate < NOW() - INTERVAL 2 WEEK THEN '15-21 days'
WHEN submitdate >= NOW() - INTERVAL 2 WEEK
    AND submitdate < NOW() - INTERVAL 1 WEEK THEN '8-14 days'
WHEN submitdate >= NOW() - INTERVAL 1 WEEK THEN 'up to 7 days'
       END Weeksubmitdate, 
           count(id) TotalClicks
FROM  survey 
WHERE submitdate >= NOW() - INTERVAL 4 WEEK
GROUP BY Weeksubmitdate
)tsq ON uq.timespan = tsq.Weeksubmitdate

何か助けはありますか?

4

3 に答える 3

3

私は通常、これを実現するためにピボットテーブルを実行します。クリック情報がSURVEYという名前のテーブルに保存され、クリックの日付/時刻のみがSURVEYテーブルの1つの列(必要なものすべて)に保存されていると仮定すると、これを行う1つの方法があります。

select   year(period),
         sum(case when month(period)=1 then 1 else 0 end) jan,
         sum(case when month(period)=2 then 1 else 0 end) feb,
         sum(case when month(period)=3 then 1 else 0 end) mar,
         sum(case when month(period)=4 then 1 else 0 end) apr,
         sum(case when month(period)=5 then 1 else 0 end) may,
         sum(case when month(period)=6 then 1 else 0 end) jun,
         sum(case when month(period)=7 then 1 else 0 end) jul,
         sum(case when month(period)=8 then 1 else 0 end) aug,
         sum(case when month(period)=9 then 1 else 0 end) sep,
         sum(case when month(period)=10 then 1 else 0 end) oct,
         sum(case when month(period)=11 then 1 else 0 end) nov,
         sum(case when month(period)=11 then 1 else 0 end) dec
from     survey
group by year(period)

出力は次のようになります。

---------------------------------------------------------------------------------
| Year  | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
---------------------------------------------------------------------------------
| 2012  |  5  |  20 |  13 | 0   |  0  |  65 |  15 |  0  |  0  |  21 |  0  |  0  |
---------------------------------------------------------------------------------

私もあなたのために同じフィドルSQLを設定しました SQLフィドルデモ

別の方法(カウント がゼロの場合でも過去4か月の列ベース): SQL Fiddle Demo

SELECT mon,
       sum(clicks) clicks
FROM   ( SELECT month(period) mnth,
                date_format(period,'%b') mon,
                count(1) clicks
         FROM   survey
         WHERE  month(period) BETWEEN month(curdate()) - 4 AND month(curdate())
         GROUP BY 1, 2
         UNION ALL
         SELECT 1 mnth, 'Jan' mon, 0 clicks
         UNION ALL
         SELECT 2 mnth, 'Feb' mon, 0 clicks
         UNION ALL
         SELECT 3 mnth, 'Mar' mon, 0 clicks
         UNION ALL
         SELECT 4 mnth, 'Apr' mon, 0 clicks
         UNION ALL
         SELECT 5 mnth, 'May' mon, 0 clicks
         UNION ALL
         SELECT 6 mnth, 'Jun' mon, 0 clicks
         UNION ALL
         SELECT 7 mnth, 'Jul' mon, 0 clicks
         UNION ALL
         SELECT 8 mnth, 'Aug' mon, 0 clicks
         UNION ALL
         SELECT 9 mnth, 'Sep' mon, 0 clicks
         UNION ALL
         SELECT 10 mnth, 'Oct' mon, 0 clicks
         UNION ALL
         SELECT 11 mnth, 'Nov' mon, 0 clicks
         UNION ALL
         SELECT 12 mnth, 'Dec' mon, 0 clicks) a
WHERE  mnth BETWEEN month(curdate()) - 4 AND month(curdate())
GROUP BY 1
ORDER BY mnth
于 2012-11-06T12:22:48.557 に答える
0

すべての月の名前を含むテーブルに参加する必要があります。これを行う1つの方法は次のとおりです。

select
    mon,
    ifnull(count(id), 0) as Clicks
from (select 'nov' as mon union select 'oct' union select 'sep' union select 'aug') m
left join survey on MONTHNAME(period) = mon
where submitdate > DATE_SUB(now(), INTERVAL 3 MONTH) 
group by 1
于 2012-11-06T12:25:25.653 に答える
0
select MONTHNAME(STR_TO_DATE(month(period), '%m'))as 'month',count(*) as clicks
 from survey group by month(period)
于 2012-11-06T12:59:58.437 に答える