• 締切済み

一定回数以上の入金データの明細を表示する

Microsoft SQL Server Management Studio 2008 にて、クエリを作成しています。 下記の入金テーブルがあります。 入金日  顧客ID  入金額 2012/2/1  0010 10000 2012/2/2 0010 10000 2012/2/3  0010 10000 2012/2/4  0010 10000 2012/2/5  0020 10000 2012/2/6  0020 10000 2012/2/7  0020 10000 2012/2/8  0030 10000 2012/2/9  0030 10000 このテーブルから1か月単位で3回以上の入金をした顧客の 明細(上記3項目)を表示したいのです。 上記の例だと、実現したい結果は下記となります。 入金日  顧客ID  入金額 2012/2/1  0010 10000 2012/2/2 0010 10000 2012/2/3  0010 10000 2012/2/4  0010 10000 2012/2/5  0020 10000 2012/2/6  0020 10000 2012/2/7  0020 10000 とりあえず、入金回数別の入金件数だけを出すクエリは成功しました。 SELECT cnt, count(*) from (select 入金テーブル.顧客ID,COUNT(*)cnt FROM 入金テーブル WHERE 入金テーブル.入金日 >= '2012-02-01 00:00:00.000' AND 入金テーブル.入金日 <= '2012-02-29 23:59:59.000' group by 入金テーブル.入金日) aaa group by cnt order by cnt しかし、 1. 明細を出すところ 2. 3回以上の入金という条件指定ができない 上記2点でつまづいています。 どなたかご教示いただけると、大変助かります。 夜も眠れません。。。

みんなの回答

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

集計関数で検索するときは HAVING を使います。 > 3回以上の入金という条件指定ができない SELECT 顧客ID, COUNT(*) FROM 入金テーブル GROUP BY 顧客ID HAVING COUNT(*) >= 3 > 明細を出すところ SELECT * FROM 入金テーブル a WHERE EXISTS(SELECT 1 FROM 入金テーブル WHERE 顧客ID = a.顧客ID HAVING COUNT(*) >= 3)

rko910
質問者

補足

お返事が遅くなり、申し訳ございません。 こちらの書き方が悪かったのですが、   1.ある一定回数以上(たとえば3回)の入金をした   2.入金詳細データ を同時に実現したいのです。 SELECT句で詳細データを出すためワイルドカードを使用し、 (SELECT * ~) なおかつ、WHERE句もしくはHAVING句でCount関数を用いて件数の指定(件数の条件指定) することはできませんか?

関連するQ&A

  • in (サブクエリ) わかんない

    table hh; +------+ | id | +------+ | 1 | | 2 | | 3 | | 2 | | 1 | | 1 | +------+ select id,count(*) as cou from hh group by id having count(*) in (1,2,3); こいつはOK select id,count(*) as cou from hh group by id having count(*) in (select count(*) from hh group by id); こいつはダメ 違いはなんですか、教えて下さい

  • access 2つのテーブルの最新日付の大小

    顧客はIDにて管理していて、請求日テーブルに顧客ID、請求日の2つのフィールド、入金日テーブルに顧客ID、入金日と作り、どんどん追加していく仕組みにしています。 ここで、未入金の顧客を探したいと思っています。 入金日>請求日であれば出るとは思うのですが、SQLにて select max(T入金日.入金日) as 入金日, T入金日.ID from T入金日 group by T入金日.ID と作り、同様に請求日の式も作りましたが、この式どうしを比べる方法がわかりません。 クエリのデザインビューでも同じようなところまでは作れるのですが… また、請求日を基準にして前後半年入金のない顧客を探せる方法もあれば合わせて教えていただきたいです。 ヒントや作り方でもいいので、何かご教授ください

  • SQL文に変数を埋め込む場合の方法

    //config.php //$table = "TableName"; 1:require "config.php"; 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM TableName GROUP BY " . 4:$fld; $res = mysql_query($sql, $conn) or die("Data抽出エラー"); 上記のソースを 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM " . $table . " GROUP BY " . $fld; 4: $res = mysql_query($sql, $conn) or die("Data抽出エラー"); この様にして、config.phpより、テーブル名を変数として読み込みたいのですが、エラーになってしまいます。 3行目をどのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • 3つのテーブルの処理について

    下記のようなテーブルがあったとして、 テーブルAを基準に考えたいのですが、、、、 テーブルAに付加する形でテーブルBのデータのidカウント数が最も少なく、idが同じもの中でdate日が一番新しいデータを表示し、古いものから並べかえかつテーブルCにidがあるものは一番最後にくるという風に並べかえたいのですが、無理でしょうか? 現在下記のようなSQLを考えていますが、うまくいかないです。。 select * from A left join(select id,case when count(id)=0 then 0 else count(id) end AS cnt FROM B group by id order by date) as b on A.id=b.id left join(select id from C) as c on A.id=c.id order by c.id desc,b.cnt; エラー↓ in the GROUP BY clause or be used in an aggregate function テーブルA id | name | comment| 1 あ   おい 2 い   えい 3 か   テス テーブルB id | event | date | 1 test1 2005/1/4 2 test1 2005/1/4 1 test2 2005/3/4 2 test2 2005/3/4 1 test3 2005/5/4 テーブルC id | 1 理想の結合データ id | name | comment| cnt | date | 3 か   テス 0    2 い   えい 2  2005/3/4  1 あ   おい 3 2005/5/4

  • 行数の取得

    mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします

    • ベストアンサー
    • MySQL
  • mysql内データ検索結果の表示順について

    mysql内のデータを条件検索する時、検索結果の表示順を指定します。 新着順(id降順)で指定する場合のエラーについてアドバイスをいただけないでしょうか。 例えば、DB内データを降順で全件表示する場合は、 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; とすることでできると思います。 そこで、条件検索で結果表示をする場合は、上記の通りにしてもエラーが発生します。これについてのコードは以下のような感じです。 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where); } これは、ORDER BY id DESCを書く位置が悪いのでしょうか? order by句は$query = select ~~~のあとに付けるという認識だったのですが、場合によって間違いとなるということなのでしょうか。 アドバイスをいただければ幸いです。

    • 締切済み
    • PHP
  • 集約関数に対する条件??

    条件式の挿入に関して思った結果を出せずおり 質問させて頂きます 現在テーブルが二つあり以下のようになります t1(テーブル1) ============= id No(商品番号) ------------- 1 001 2 002 3 003 ============= t2(テーブル2) ====================== No(商品番号) day(入荷日) ---------------------- 002 2008/04/01 003 2008/02/22 003 2008/04/10 ====================== 商品に対して入荷回数(cnt)と最終入荷日(lastday)を知りたく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No; としました 結果1 ====================== No cnt lastday ---------------------- 001 0 002 1 2008/04/01 003 2 2008/04/10 ====================== 上のセレクトは「現在」の結果ですので 例えば2008/03/30現在の表記が欲しく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No where t2.day <= '2008/03/30' or t2.day is null group by t1.No; または select t1.id, count(t2.No) as cnt, max(t2.day) as lastday , t2.day from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No having t2.day <= '2008/03/30' or t2.day is null; とすると 結果2 ====================== No cnt lastday ---------------------- 001 0 003 1 2008/02/22 ====================== となります No:001 の情報(cnt:0)と同様に 希望結果 ====================== No cnt lastday ---------------------- 001 0 002 0 003 1 2008/02/22 ====================== No:002 cnt:0 の結果を残すのにはどのようなセレクト文を組んだらよいのでしょうか? 宜しくお願いいたします mysql 4.0 わかりやすい表題が思いつかず 表題と内容が食い違っているかもしれません 大変申し訳ありません

    • ベストアンサー
    • MySQL
  • Access ユニオンクエリについて・・・・

    顧客管理作成中です。 テーブル:顧客dataの項目(フィールド名)に 顧客名をはじめとして、 入金予定日,入金予定額,入金日,入金額,クレジット入金日,クレジット入金額とあります。 それぞれ、日付が違うのですが、日々の流れをチェックできるよう、 日付でまとめたいのです(日々の金額は日計) 希望の形は 日付 入金予定額   入金額   クレジット入金額 11/1  11/2 11/3   ・   ・   ・ _____________________ 月合計 _____________________ 全体合計 まず、グループ化したクエリを3つ作り、その後 ユニオンクエリを作って見ましたが、合計の作り方がわかりません。 ★作成状況★ ■グループ化した3つのクエリを作成 (1)Q名・支払予定金額(入金予定日,入金予定額の合計) (2)Q名・入金     (入金日,入金額の合計) (3)Q名・クレジット   (クレジット入金日,クレジット入金額の合計) ■ユニオンクエリ SELECT 日付,支払予定金額の合計,0 as 金額の合計,0 as クレジット入金額の合計 FROM 支払予定金額 UNION SELECT 日付,0 as 支払予定金額の合計,金額の合計,0 as クレジット入金額の合計 FROM 入金 UNION SELECT 日付,0 as 支払予定金額の合計,0 as 金額の合計,クレジット入金額の合計 FROM クレジット; はじめて、ユニオンクエリを使ったので、わからないことだらけです。。。 どなたか手を貸してください(-"-;) 宜しくお願いいたします

  • 各伝票に対して明細を1行目だけ表示したい

    たびたびお世話になります。 仮に以下のようなテーブルを考えるとします。 ○テーブルA (伝票) 伝票番号 (PK) 顧客コード ○テーブルB (伝票明細) 伝票番号 (PK) 伝票明細 (PK) 注文コード 大盛り区分 レストランなどでお客さんが注文した注文伝票を 想像していただければ良いかと思います。 一つの伝票番号に対して、複数の伝票明細があると。 DB上は上記のように格納するとします。 ここでテーブル結合を使って、各伝票の1行目の明細を表示しながら SQL1発で抜いてきたいと思います。どういうSQLを考えたら良いでしょうか? テーブルBの表示項目が1つだけなら、 SELECT A.伝票番号, A.顧客コード, (SELECT TOP 1 注文コード FROM テーブルB B WHERE A.伝票番号 = B.伝票番号) FROM テーブルA A で良いのですが、複数項目となるとどうやったら良いのか判りません。