質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

1回答

1661閲覧

ユニークアイテムの推移を集計

callmichael

総合スコア71

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2016/05/13 05:30

編集2022/01/12 10:55

下記のようなテーブルがあるときに、直近1日間,7日間,30日間に購入されたproductの
ユニーク数を日毎に集計したいと思っています。

テーブルイメージ create date / product / price 2016-05-12 15:16:17 / bread / 340 2016-05-13 11:10:31 / icecream / 280
抽出イメージ date / yesterday / 7days / 30days 2016-05-12/ 3 / 7 / 31 2016-05-13/ 4 / 8 / 29

上記のように、5/12時点では、
前日に購入されたユニークproductが3点、直近の30日間では31点
のような結果を抽出したいのですが、方法のイメージが付きません。
方向性だけでもご教授いただけると幸いです。
よろしくお願いいたします。

※追記
本日分については、下記のSQLで出せると思うのですが、これを日ごとに出す方法がわかりません。

select count(case when datediff(DATE_FORMAT(NOW(), '%Y-%m-%d'),DATE_FORMAT(create_date, '%Y-%m-%d')) = 1 then product end) as yesterday, count(case when datediff(DATE_FORMAT(NOW(), '%Y-%m-%d'),DATE_FORMAT(create_date, '%Y-%m-%d')) between 1 and 7 then product end) as 7days, count(case when datediff(DATE_FORMAT(NOW(), '%Y-%m-%d'),DATE_FORMAT(create_date, '%Y-%m-%d')) between 1 and 30 then product end) as 30days from テーブル名

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

製品ごとに直近期間でナンボ売れたかという集計をするという認識であってますでしょうか?
その前提で書いてみたものを提案します。
どちらも似たような結果になりますが、プランAのほうは売れてない日は行がでません。

■テストで使ったテーブルスキーマ
CREATE TABLE temp (
created datetime,
pid int(11),
price int(11)
)

■プランA(CASEで集計)
SELECT
DATE_FORMAT(created, '%Y-%m-%d') AS date,
SUM(CASE WHEN DATEDIFF(NOW(),created) < 2 THEN 1 ELSE 0 END) AS yeaterday,
SUM(CASE WHEN DATEDIFF(NOW(),created) < 8 THEN 1 ELSE 0 END) AS 7days,
SUM(CASE WHEN DATEDIFF(NOW(),created) < 31 THEN 1 ELSE 0 END) AS 30days
FROM
temp
WHERE pid = 2
GROUP BY DATE_FORMAT(created, '%Y-%m-%d')

※違う製品の集計を取るときはWHERE句内のpidを入れ替えます。
※集計スパンを変えるときはCASE式内のDATEDIFFと比較する数字を編集します。

■プランB(JOINして集計)
SELECT
calendar.date,
IF(7days.cnt IS NULL, 0 ,7days.cnt) AS 7days,
IF(30days.cnt IS NULL, 0 ,30days.cnt) AS 30days
FROM
(
SELECT
DATE_FORMAT(created, '%Y-%m-%d') AS date,
count()
FROM
temp
GROUP BY DATE_FORMAT(created, '%Y-%m-%d')
) AS calendar
LEFT JOIN
(
SELECT
DATE_FORMAT(created, '%Y-%m-%d') AS date,
count(
) AS cnt
FROM
temp
WHERE
pid = 2 AND DATEDIFF(NOW(),created) < 8
GROUP BY DATE_FORMAT(created, '%Y-%m-%d')
) AS 7days ON calendar.date = 7days.date
LEFT JOIN
(
SELECT
DATE_FORMAT(created, '%Y-%m-%d') AS date,
count(*) AS cnt
FROM
temp
WHERE
pid = 2 AND DATEDIFF(NOW(),created) < 31
GROUP BY DATE_FORMAT(created, '%Y-%m-%d')
) AS 30days ON calendar.date = 30days.date

投稿2016/05/20 07:45

hermitagejp

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hermitagejp

2016/05/20 07:58

失礼、スパンごとに売れたアイテムのユニーク数が知りたいのですね。 SELECT DATE_FORMAT(created, '%Y-%m-%d') AS date, COUNT(CASE WHEN DATEDIFF(NOW(),created) < 2 THEN pid ELSE 0 END) AS yeaterday, COUNT(CASE WHEN DATEDIFF(NOW(),created) < 8 THEN pid ELSE 0 END) AS 7days, COUNT(CASE WHEN DATEDIFF(NOW(),created) < 31 THEN pid ELSE 0 END) AS 30days FROM temp GROUP BY DATE_FORMAT(created, '%Y-%m-%d') こちらでどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問