ここから本文です

こんな集計可能ですか? レコード番号 項目1 項目2 1 A X 2 A Y 3 A Z 4 B ...

jgnrngflfoirgさん

2017/10/501:17:24

こんな集計可能ですか?

レコード番号 項目1 項目2
1 A X
2 A Y
3 A Z
4 B X
5 B Z
6 C X
7 D X
8 D Y
9 D Z
10 E Z

上記テーブル

から項目1・2をサマリーした結果を出力したい。

X Z X&Y&Z X&Z
1件 1件 2件 1件
(全ての件数を足すと項目1の重複を省いたカウント数となる)

お手数ですが方法ありましたらお教えください。

閲覧数:
50
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

2017/10/513:58:05

元のテーブルから下記のようなテーブルをVBAで作る方法です。
このテーブルを集計すれば求める結果が得られます。

|項目1|項目2|
|A.....|XYZ.....|
|B.....|XZ.......|
|C.....|X.........|
|D.....|XYZ.....|
|E.....|Z.........|

①元のテーブルから「項目1と項目2の昇順に並べたクエリ」を用意します。

②上記のような「項目1をキーとして項目2を横並びにしたテーブル」を用意します。
(この時点では中身はカラの状態です)

③次の投稿のVBAコードを標準モジュールに登録して、実行します。

④②のテーブルの中味が正しいことを確認し、「項目2をグループ化して件数を求めるクエリ」を作り実行します。

結果
|項目2|件数|
|X.......|....1|
|XYZ...|....2|
|XZ.....|....1|
|Z.......|....1|

  • 2017/10/514:03:21

    Public Function Create_Group_Concatenate()
    Dim DB1 As database
    Dim RS1 As Recordset
    Dim RS2 As Recordset
    Dim new_key As String
    Dim old_key As String
    Dim wk_komoku2 As String

    Set DB1 = CurrentDb()
    Set RS1 = DB1.OpenRecordset("項目1と項目2の昇順に並べたクエリ")
    DB1.Execute "DELETE * FROM 項目1をキーとして項目2を横並びにしたテーブル"
    Set RS2 = DB1.OpenRecordset("項目1をキーとして項目2を横並びにしたテーブル")

    RS1.MoveFirst
    If RS1.EOF Then
    new_key = String(255, Chr(255))
    Else
    new_key = RS1![項目1]
    End If

    Do Until new_key = String(255, Chr(255))
    old_key = new_key
    wk_komoku2 = ""

    Do Until new_key <> old_key
    wk_komoku2 = wk_komoku2 & RS1![項目2]
    RS1.MoveNext
    If RS1.EOF Then
    new_key = String(255, Chr(255))
    Else
    new_key = RS1![項目1]
    End If
    DoEvents
    Loop

    (つづく)

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/10/11 23:08:05

皆様のアイデアに感服です。
全員にベストアンサーを差し上げたいのですが、1番直感的で方法も分かりやすかったonyourside555さんをベストアンサーとします。ありがとうございました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

kiku30246さん

2017/10/509:05:46

Access で良かったですか?

標準モジュールにユーザ定義関数を作って、クエリからそれを利用します

※ 確認時のテーブル名は「T9」だったので、変更は必須です
また、関数名は適宜変更してください

以下を標準モジュールに記述しておきます


Option Compare Database
Option Explicit

Dim dic As Object

Public Function T9Lk(vSrc As Variant) As String
   If (dic Is Nothing) Then Exit Function
   T9Lk = Mid(dic(vSrc), 2)
End Function

Public Function T9LkInit() As Boolean
   Dim rs As New ADODB.Recordset
   Dim v As Variant

   Set dic = CreateObject("Scripting.Dictionary")
   dic.CompareMode = vbTextCompare

   rs.Source = "SELECT 項目1, 項目2 FROM T9 ORDER BY 項目2;"
   rs.Open , CurrentProject.Connection
   While (Not rs.EOF)
      v = rs("項目1")
      dic(v) = dic(v) & "&" & rs("項目2")
      rs.MoveNext
   Wend
   rs.Close
   T9LkInit = True
End Function


これらの関数をクエリから利用します

クエリの SQLビュー に記述して、表示を確認してみます

TRANSFORM Count(*) AS 値
SELECT 結果 FROM (
SELECT '結果' AS 結果, T9Lk(項目1) AS 文字 FROM T9
WHERE T9LkInit()
GROUP BY 項目1
) AS Q1
GROUP BY 結果
PIVOT 文字;

とか

TRANSFORM IIF(Count(*),1) AS 値
SELECT 項目1 FROM T9
WHERE T9LkInit()
GROUP BY 項目1
PIVOT T9Lk(項目1);



※ 重複したら、そのままの文字列に
重複を排除するのなら
>   rs.Source = "SELECT 項目1, 項目2 FROM T9 ORDER BY 項目2;"
ここで GROUP BY すれば・・・

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

nora1962jpさん

2017/10/502:13:54

もしかしてこういうことですか?

(Oracle用)

select x, count(*)
from ( select 項目1, LISTAGG( 項目2, ',') WITHIN GROUP (order by 項目2 nulls last) x
from テーブル
group by 項目1 )
group by x
order by x;

MySQL(MariaDB)なら

select x, count(*)
from ( select 項目1, group_concat( 項目2 order by 項目2 ) x
from tbl1
group by 項目1 ) q
group by x;

ただ、項目2に同じ値がある時の要件が分かりませんね。
11 F X
12 F X
13 F Y
などの場合。


ACCESSにはLISTAGG、GROUP_CONCATにあたる関数がないので普通のやり方では無理だと思います。
VBAでGROUP_CONCATを真似たものを作った例はあります。
https://soudan1.biglobe.ne.jp/qa8059912.html

ですが、かなり無理矢理感を感じます。パフォーマンス的にも厳しいと思います。
グルーピングする時にリスト化する項目の並び順について考慮する必要があるかもしれません。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。