tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル2つのシートの件数を求めたい
記事No16512
投稿日: 2019/12/23(Mon) 20:36
投稿者EXCEL使い
いつもお世話になっています。
以前のスレッドで、エクセルのシートをレコードセットに取り込んで
使用していると投稿しましたが、新たな疑問が出ましたので別スレッドを
立てました。
早速ですが、質問です。
まず、
テーブル1
コード  名前 
1111   AAAA
1111   BBBB
1111   CCCC
というデータがあり、
テーブル2
コード  名前  データ
1111   AAAA  0001
1111   BBBB  Null
というデータがあったとき
SQLを発行して結果として
コード  名前  テーブル1件数 テーブル2件数
1111   AAAA    3        1
という結果を得たいのですが、どうSQLを書けばいいのか
わからないのでどなたかご教授いただけるとありがたいです。
検索条件としては、
テーブル1は、全件からコードごと名前ごとで件数をカウント、
テーブル2は、全件からデータがNullでないデータをコードごと
名前とに件数をカウントして、それを同じレコードセットで
1度のSQLで取得したいというものです。
サブクエリーやUNIONを使ってやってみたのですがエラーが出たり
目的の件数でなかったりしてわかりません。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: 2つのシートの件数を求めたい
記事No16515
投稿日: 2019/12/24(Tue) 10:01
投稿者魔界の仮面弁士
前提条件が不足しているので、回答しにくいです。

今回はコードが '1111' しかありませんが、
複数のコードがあった場合にはどういう結果になるのでしょうか。

両方のテーブルに同じコードがあったにも関わらず、
それぞれの名前が合致しなかった場合はどういう動作を期待するのでしょうか。


> 1度のSQLで取得したいというものです。

何故 1 回でなければいけないのか、理由を知りたいところですが、それはさておき。

結合条件が明確になれば、一回の SELECT にまとめられそうですが、
現状は UNION 結合した副問い合わせを集計する形が手っ取り早いかも。

SELECT
   [コード], [仮名] AS [名前]
  , SUM([件数1]) AS [テーブル1件数]
  , SUM([件数2]) AS [テーブル2件数]
FROM (
  SELECT [コード], MIN([名前]) AS [仮名]
   , COUNT(*) AS [件数1]
   , NULL AS [件数2]
  FROM [テーブル1]
  GROUP BY [コード]
  UNION ALL
  SELECT [コード], MIN([名前]) AS [仮名]
  , NULL AS [件数1]
  , COUNT(*) AS [件数2]
  FROM [テーブル2]
  WHERE [データ] IS NOT NULL
  GROUP BY [コード]
) AS [表]
GROUP BY [コード], [仮名]



UNION を使わずに、JOIN 構文で結合させる手も考えてみましたが、
細かい条件が曖昧なので、現状の情報だけだとカウントしにくいですね。

たとえば結果に「名前」フィールドがありますが、その元となる
[テーブル1].[名前] と [テーブル2].[名前] の関係が現状不明瞭です。

同じコードがテーブル1に 3 件あって、テーブル2に 2 件あった場合、
CROSS JOIN だと 6 件、OUTER JOIN だと 3 件、INNER JOIN だと 2 件になるので
細かい除外条件を考えるよりは、個別にカウントして UNION 等でまとめた方が手っ取り早そうです。

[ツリー表示へ]
タイトルRe^2: 2つのシートの件数を求めたい
記事No16516
投稿日: 2019/12/24(Tue) 21:32
投稿者EXCEL使い
魔界の仮面弁士さま、返信ありがとうございます。
提供できる情報が少なくてすいません。
やりたいことは、テーブル1でコードごとに件数をカウント
テーブル2でコードごとに件数をカウント、
それをコードごとにレコードセットで抽出みたいな感じ
です。
その他に、データがNull以外のデータを抽出したりする
こともありますが、一番は最初に書いたことが希望でした。
ですが、教えていただいたSQLを見てみましたが私には
到底理解できませんでした。情けない・・・
なので、方法を変えて一旦テーブル1でコードごとに件数を
カウント。それをEOFまでループして出てきたコードで
テーブル2にコードごとに件数をカウントするSQLを発行して
データを取得。それをセルに吐き出すという方法に変えました。

ソース;
 SELECT コード,Count(*) AS cnt FROM テーブル1
    GRUP BY コード

 Do UNTIL EOF
  SELECT コード,Count(*) AS cnt FROM テーブル2
    WERE コード=テーブル1.コード
    GRUP BY コード 
  Range("A1")=テーブル1!コード
  Range("B1")=テーブル1!cnt
  Range("C1")=テーブル2!cnt
  テーブル1.MoveNext
 Loop
と、まぁ作ったソースはこんな感じでしょうか。
これで何とか希望の件数のカウントは出来たので
これでいこうと思います。
今回、少ない情報のなかアドバイスをいただき
ありがとうございました。
また何かあったらよろしくお願いします。

[ツリー表示へ]