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

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

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

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

Q&A

解決済

3回答

399閲覧

MySQLで特定のキーワードを持つグループ以外を日別に集計したい

Bolboldo

総合スコア11

MySQL

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

0グッド

0クリップ

投稿2017/08/17 12:14

###前提・実現したいこと
2つのカラムをキーとするテーブルで、特定の文字列を持つグループ以外を日別に集計しようとしています。
以下の販売履歴テーブルで顧客IDと来店回数で1グループとして、
(同じuser_idでもuser_id:1001,in_count:1で1件user_id:1001,in_count:2で1件と集計)
node内にはカンマ区切りで複数の項目が入る場合があり、nodeに「2_HPから選ぶ」が入っていないグループ数を集計したいです。
イメージ説明
このテーブルの場合、1002以外のユーザー数として以下の結果を想定しています。
日付 人数
08-15 1
08-17 1
08-20 1
###発生している問題・エラーメッセージ
作成したSQLを試した所取り除こうとしている「2_HPから選ぶ」を含むグループも一緒に集計してしまっています。

###該当のソースコード

select date(tmp.create_date) as 日付 ,count(user_id) as 人数 from ( select user_id ,in_count ,node ,create_date from user_history group by user_id,in_count ) tmp where tmp.user_id <> any ( select user_id from user_history where node like '%2_HPから選ぶ%' ) and tmp.in_count <> any ( select in_count from user_history where node like '%2_HPから選ぶ%' ) group by date(tmp.create_date)

###試したこと
ANYが問題かとALLなども試しても出力したい結果となりませんでした。
お力をお借りできると嬉しいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こうかな

sql

1SELECT 2 create_date 3 ,COUNT(DISTINCT user_id, in_count) 4FROM 5 user_history 6WHERE 7 (user_id, in_count) NOT IN ( 8 SELECT 9 user_id 10 ,in_count 11 FROM 12 user_history 13 WHERE 14 node LIKE "%2_HPから選ぶ%" 15 ) 16GROUP BY 17 create_date 18;

投稿2017/08/17 14:28

SVC34

総合スコア1149

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

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

sazi

2017/08/17 15:57

mysqlは、count()の中にdistinct指定だと複数項目書けるんですか! 知らなかった。流石です。
SVC34

2017/08/18 00:18

私も今回たまたま気づきました。これは他のDBMS、SQL標準でも取り込んで欲しいですね。
Bolboldo

2017/08/20 15:07

教えていただいた方法で出したい結果を取得できましたありがとうございます!
guest

0

グルーピングを行うのは対象を絞ってから行うのが効率的です。

SQL

1select date(create_date) as 日付 2 , count(*) as 人数 3from ( 4 select user_id, in_count, create_date 5 from user_history 6 where node not like '%2_HPから選ぶ%' 7 group by 8 user_id, in_count, create_date 9) tmp 10group by 11 date(create_date)

追記

SVC34さんのを見て改良型を。

SQL

1select date(create_date) as 日付 2 , count(distinct user_id, in_count) as 人数 3from user_history 4where node not like '%2_HPから選ぶ%' 5group by 6 date(create_date)

投稿2017/08/17 13:42

編集2017/08/17 16:02
sazi

総合スコア25138

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

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

0

MYSQL無いので検証してませんが、こんなのでいかがでしょうか。

SQL

1SELECT 2 DATE(create_date) AS 日付, 3 COUNT(*) AS 人数 4FROM( 5 SELECT DISTINCT 6 user_id, incount, create_date 7 FROM 8 user_history 9 WHERE 10 ( user_id, incount ) NOT IN ( 11 SELECT 12 user_id, incount 13 FROM 14 user_history 15 WHERE 16 node='2_HPから選ぶ' 17 ) 18) 19GROUP BY 20 DATE(create_date)

投稿2017/08/17 13:27

ryoooooo

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問