お世話になります。
クロス集計クエリの結果が以下の内容になっているとします。
項目 2013年10月 2014年07月 2014年08月 2014年09月
商品数 100 150 120 130
顧客数 2000 2200 2100 2200
※2013年11月~2014年6月までのデータ無し
上記クエリで、データの無い期間の商品数及び顧客数を0とし、また見出しも
埋めたいところです。
項目 2013年10月 2013年11月 ・・・2014年08月 2014年09月
商品数 100 0 120 130
顧客数 2000 0 2100 2200
このように表示したい場合、やはり元データにレコードを作成し各数量は0で
登録しなければなりませんでしょうか。
それとも、実際にレコードが無くても、上記表示は可能でしょうか。
************
当該クエリの内容は最終的にExcelファイルに貼り付けします。
現状、左詰めで貼り付けられてしまう為、可能であれば1年分の
体裁を整えた状態で貼り付けしたいところです。
ご教示の程、宜しくお願い致します。
No.7ベストアンサー
- 回答日時:
【補足の補足】
色々とテストした結果、列[年月]がテキスト型の場合には、In句が自動生成されませんね。日付型ですと、自動生成されるのですが・・・。
PIVOT [年月日] In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");
そして、テキスト型に限っては、このような書き方でも「型の不一致エラー」はでないようです。
In句を自動生成させるのか否か?
ちょっと、検討事項かもしれませんね。
たまたま?かもしれませんが、
midashi = "''2013年11月', 省略 ,'2014年10月'" ※
・・・
PIVOT Format([テーブル名].年月,"yyyy年mm月") In ( & midashi & );
で、うまくいきました。。本来ならエラーになるのでしょうか。
なお、※の箇所は開始年月からmidashiに入れる文字列を生成したいと
考えております
No.10
- 回答日時:
多分、無意味な補足かと思いますが・・・。
1:TRANSFORM Sum(T1.件数) AS 件数のカウント
2:TRANSFORM Nz(Sum(T1.件数),0) AS 件数のカウント
1の戻り値は""
2の戻り値は0
ですから、空欄ではなく0を表示したい時は Nz()で。
No.9
- 回答日時:
実際にエラーが発生しなきゃーOK!
私は、そう思います。
でも、仮にテキスト型だと意味がない整形です。
(添付図を参照のこと)
http://www.tsware.jp/tips/tips_025.htm
なお、質問者の解決策は、一般的なそれなようですね。私ならば、
PIVOT Format([テーブル名].年月,"yyyy年mm月") In (XXXXXX);
でクエリを用意しておいて、クエリの編集コマンドでXXXXXXを置換するでしょう。でも、midashi も良い手ですね。勉強になりました。
No.8
- 回答日時:
>教えて頂いた方法だと、見出し(yyyy年mm月)の箇所が固定になってしまうかと思います。
>例えば、今月11月に処理を実行する場合、前月(10月)から過去12ヵ月分で抽出しなければなりません。
開始年月は、ユーザーフォームか何かに入力して、クエリを実行するボタンか何かをクリックした時に結果が表示されるように作っていると思います。
なので、クエリを、ユーザーフォーム上のテキストボックスの値を参照して演算するようにすれば良いだけです。
例えば、「ユーザーフォーム」と言う名前のフォームに「開始年月」と言うテキストボックスを用意し、そこに「201309」のように年月を6桁の数字で入れさせるようにします。
SELECT 年月,SUM(商品数),SUM(顧客数)
FROM (SELECT 年月,商品数,顧客数 FROM 元テーブル
union
SELECT Format(DateAdd("m",0,Mid([Forms]![ユーザーフォーム]![開始年月],1,4) & "/" & Mid([Forms]![ユーザーフォーム]![開始年月],5,2) & "/01"),"yyyy年mm月") as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT Format(DateAdd("m",1,Mid([Forms]![ユーザーフォーム]![開始年月],1,4) & "/" & Mid([Forms]![ユーザーフォーム]![開始年月],5,2) & "/01"),"yyyy年mm月") as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
(中略)
union
SELECT Format(DateAdd("m",11,Mid([Forms]![ユーザーフォーム]![開始年月],1,4) & "/" & Mid([Forms]![ユーザーフォーム]![開始年月],5,2) & "/01"),"yyyy年mm月") as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル)
GROUP BY 年月
のようにします。
テキストボックスへの入力規則が「2013/09」のようになっているなら、クエリの中のMid関数の「開始文字位置」を5から6に変更すれば良いです。
chie65535様
度々のご回答ありがとうございます。
まだ実際に試しておりませんが、仰るとおりフォーム上に開始年月だけもたせて
そこを参照させるようにすればいけそうですね。
試してみたいと思います。
ありがとうございました。
No.6
- 回答日時:
Excel に出力するという事なので、
クロス集計結果を Excel に出力後、整形した方が簡単かと思います。
過去質問で解決したと思われる、見出し転記 & CopyFromRecordset した範囲が
B4:F6 だった場合の一例です。
定数 xlShiftToRight がありますが、Access から使うのであれば
Const xlShiftToRight = -4161
と定義しておけばよいと思います。
以下は Excel で記述してみたら・・・というものになります。
Public Sub Samp1()
Dim iRows As Long, iCol As Long
Dim dtL As Date, dtC As Date
Dim i As Long, j As Long
With Range("B4:F6")
iRows = .Rows.Count
For iCol = .Columns.Count To 3 Step -1
With .Cells(1, iCol)
dtL = CDate(.Offset(, -1).Value)
dtC = CDate(.Value)
i = DateDiff("m", dtL, dtC) - 1
If (i > 0) Then
.Resize(iRows, i).Insert xlShiftToRight
For j = 1 To i
With .Offset(, -j)
.Resize(iRows).Value = 0
.Value = Format(DateAdd("m", -j, dtC), "yyyy年mm月")
End With
Next
End If
End With
Next
End With
End Sub
※ 単純にクロス集計時に盛り込もうとした時には
「列見出し」を設定すればデータの無い月の表示も可能です。
が、表示月の変更があれば修正する必要があります。
流動的に変更する方法もありますが・・・
それは、VBA でクロス集計のSQLを再定義するものになります。
ただし、データの無い部分の表示は空欄(空白)になります。
必要そうなら提示しますが、元テーブルの構成等補足してください。
なお、上記記述では、もし右端に罫線とかあった場合はズレて行きます。
そういった場合は、作業用シートに展開処理後、本シートに移すとか・・・
※ Access に記述するのなら、変数 MyRs がレコードセットと仮定すると
With Range("B4:F6")
部分の前に処理を追加します。
B4 から書き出すと仮定した雰囲気は(以下未検証)
Set MyRs = MyDB.OpenRecordset(MySQL)
With obj.Worksheets(シート名)
' .Activate
With .Range("B4")
For i = 0 To MyRs.Fields.Count - 1
.Offset(,i).Value = MyRs(i).Name
Next
.Offset(1).CopyFromRecordset MyRs
With .Resize(MyRs.RecordCount + 1, MyRs.Fields.Count) ' ★
' ★ 上記処理
End With
End With
End With
No.5
- 回答日時:
補足:
PIVOT Format([年月日],"@@@@@@@@") In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");
列[年月]の型と表示のあり方では、このような書き方をしないと”型が一致しません!”というエラーも。この辺りは、試行錯誤されてください。
No.4
- 回答日時:
"oooo"・・・・・これは、Accessの日付型の書式指定子の一つです。
ですから、PIVOT Format([年月日],"yyyy年mm月") In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");
と書くこともできます。
No.3
- 回答日時:
>これは元テーブルに9~12月のレコードが存在するからでしょうか?
いえ、違います。
PIVOT Format([年月日],"oooo") In (XXXXX);
XXXXX⇒"1月","3月","5月","11月","12月"
と書き換えると、表示は次のように。要は、 Format IN 句次第です。
f_a_007様
度々ありがとうございます。
今現在の年月からXXXXXの部分を生成すればよさそうですね。
ちなみにコチラの集計クエリのPIVOTの箇所は、
PIVOT [テーブル名].年月;
となっております。
これを教えて頂いたものに置き換えると、
PIVOT Format([テーブル名].年月,"oooo") In (XXXXX);
となりますが、"oooo"の箇所はどう記載すればよいのでしょうか。
なお、年月には「yyyy年mm月」というような文字列になってます。
No.2
- 回答日時:
クロス集計は、そもそも添付図のように表示されます。
データの無い月を非表示にするのが至難ですよ。f_a_007様
いつもご回答ありがとうございます。
添付された画像は9~12月分の数量がブランクで、ちゃんと見出し
部分が表示されてますが、これは元テーブルに9~12月のレコードが
存在するからでしょうか?
質問させて頂いた例では2013年11月~2014年6月のレコードが
元テーブルにありません。
なので、この元テーブルを使って集計してもレコードが無い年月が
詰まって表示されます。
2013年10月 2014年07月 2014年08月 2014年09月
No.1
- 回答日時:
元テーブルをクロス集計しないで、
SELECT 年月,SUM(商品数),SUM(顧客数)
FROM (SELECT 年月,商品数,顧客数 FROM 元テーブル
union
SELECT "2013年10月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2013年11月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2013年12月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年01月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年02月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年03月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年04月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年05月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年06月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年07月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年08月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル
union
SELECT "2014年09月" as 年月,0 as 商品数,0 as 顧客数 FROM 元テーブル)
GROUP BY 年月
と言うクエリをクロス集計すれば、無い部分に0が入ります。
chie65535様
いつもご回答ありがとうございます。
教えて頂いた方法だと、見出し(yyyy年mm月)の箇所が固定に
なってしまうかと思います。
例えば、今月11月に処理を実行する場合、前月(10月)から過去12ヵ月分で
抽出しなければなりません。
説明不足で申し訳ございませんでした。
今回質問させて頂いたクロス集計クエリも、元テーブルをUNIONクエリにして
それをクロス集計しております。
※元テーブルが、yyyy年mm月、商品数、顧客数、拠点ID
というように、商品数と顧客数が横並びになっている為。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access IF文でテーブルに存在し...
-
コンボボックスで新規登録する場合
-
Access クエリ このレコードセ...
-
Access フォームのデータがテー...
-
Access2000 単票フォーム上の...
-
Excel 2019 のピボットテーブル...
-
Accessでテーブル名やクエリ名...
-
Accessでテーブルの値をテキス...
-
列が存在しないと言われる
-
複数のレコードを1つのレコード...
-
ACCESSで400以上のフィールドが...
-
AccessでNullをカウントする方法
-
「直需」の意味を教えてください
-
accessのレポートで元になるテ...
-
テキストファイルの内容を、フ...
-
ファイルメーカー8.5
-
VBA 得意先ごと且つ日付ごとに...
-
Accessで、フィールドにルック...
-
エクセルグラフの凡例スペース
-
変数が選択リストにありません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAでクエリーのレコー...
-
シングルクォーテーションとダ...
-
Access フォームのデータがテー...
-
Access IF文でテーブルに存在し...
-
データベースの1要素に複数デー...
-
ACCESS で マクロの中でフィ...
-
ACCESS2003 Aアクロバットを介...
-
Access 既に開いているフォー...
-
顧客IDを入力すると顧客名や住...
-
ワードでの単純作業の効率化に...
-
Access クエリ このレコードセ...
-
テーブル1 2 3 の結合
-
VBAで検索条件式の書き方教えて...
-
ワードで保存するファイル名の...
-
Accessデータベースで行と列を...
-
access フォーム間で情報が引...
-
Access レコードロックについて...
-
ACCESS 顧客データ 購入履歴...
-
文字化け、記号の含まれるフィ...
-
別のDBからテーブルをコピーす...
おすすめ情報