マンガでよめる痔のこと・薬のこと

お世話になります。

クロス集計クエリの結果が以下の内容になっているとします。

項目   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年分の
体裁を整えた状態で貼り付けしたいところです。


ご教示の程、宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (10件)

【補足の補足】



色々とテストした結果、列[年月]がテキスト型の場合には、In句が自動生成されませんね。日付型ですと、自動生成されるのですが・・・。

PIVOT [年月日] In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");

そして、テキスト型に限っては、このような書き方でも「型の不一致エラー」はでないようです。

In句を自動生成させるのか否か?

ちょっと、検討事項かもしれませんね。
    • good
    • 0
この回答へのお礼

たまたま?かもしれませんが、

midashi = "''2013年11月', 省略 ,'2014年10月'" ※
・・・
PIVOT Format([テーブル名].年月,"yyyy年mm月") In ( & midashi & );

で、うまくいきました。。本来ならエラーになるのでしょうか。

なお、※の箇所は開始年月からmidashiに入れる文字列を生成したいと
考えております

お礼日時:2014/11/04 16:46

多分、無意味な補足かと思いますが・・・。



1:TRANSFORM Sum(T1.件数) AS 件数のカウント
2:TRANSFORM Nz(Sum(T1.件数),0) AS 件数のカウント

1の戻り値は""
2の戻り値は0

ですから、空欄ではなく0を表示したい時は Nz()で。
    • good
    • 0

実際にエラーが発生しなきゃーOK!


私は、そう思います。
でも、仮にテキスト型だと意味がない整形です。
(添付図を参照のこと)

http://www.tsware.jp/tips/tips_025.htm

なお、質問者の解決策は、一般的なそれなようですね。私ならば、

PIVOT Format([テーブル名].年月,"yyyy年mm月") In (XXXXXX);

でクエリを用意しておいて、クエリの編集コマンドでXXXXXXを置換するでしょう。でも、midashi も良い手ですね。勉強になりました。
「Access クロス集計クエリについて」の回答画像9
    • good
    • 0

>教えて頂いた方法だと、見出し(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に変更すれば良いです。
    • good
    • 0
この回答へのお礼

chie65535様
度々のご回答ありがとうございます。
まだ実際に試しておりませんが、仰るとおりフォーム上に開始年月だけもたせて
そこを参照させるようにすればいけそうですね。

試してみたいと思います。
ありがとうございました。

お礼日時:2014/11/04 16:58

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
    • good
    • 0

補足:



PIVOT Format([年月日],"@@@@@@@@") In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");

列[年月]の型と表示のあり方では、このような書き方をしないと”型が一致しません!”というエラーも。この辺りは、試行錯誤されてください。
    • good
    • 0

"oooo"・・・・・これは、Accessの日付型の書式指定子の一つです。

ですから、

PIVOT Format([年月日],"yyyy年mm月") In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");

と書くこともできます。
「Access クロス集計クエリについて」の回答画像4
    • good
    • 0

>これは元テーブルに9~12月のレコードが存在するからでしょうか?



いえ、違います。

PIVOT Format([年月日],"oooo") In (XXXXX);

XXXXX⇒"1月","3月","5月","11月","12月"

と書き換えると、表示は次のように。要は、 Format IN 句次第です。
「Access クロス集計クエリについて」の回答画像3
    • good
    • 0
この回答へのお礼

f_a_007様
度々ありがとうございます。

今現在の年月からXXXXXの部分を生成すればよさそうですね。

ちなみにコチラの集計クエリのPIVOTの箇所は、
PIVOT [テーブル名].年月;
となっております。

これを教えて頂いたものに置き換えると、
PIVOT Format([テーブル名].年月,"oooo") In (XXXXX);
となりますが、"oooo"の箇所はどう記載すればよいのでしょうか。
なお、年月には「yyyy年mm月」というような文字列になってます。

お礼日時:2014/11/04 14:21

クロス集計は、そもそも添付図のように表示されます。

データの無い月を非表示にするのが至難ですよ。
「Access クロス集計クエリについて」の回答画像2
    • good
    • 0
この回答へのお礼

f_a_007様
いつもご回答ありがとうございます。

添付された画像は9~12月分の数量がブランクで、ちゃんと見出し
部分が表示されてますが、これは元テーブルに9~12月のレコードが
存在するからでしょうか?

質問させて頂いた例では2013年11月~2014年6月のレコードが
元テーブルにありません。

なので、この元テーブルを使って集計してもレコードが無い年月が
詰まって表示されます。
2013年10月 2014年07月 2014年08月 2014年09月

お礼日時:2014/11/04 13:41

元テーブルをクロス集計しないで、



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が入ります。
    • good
    • 0
この回答へのお礼

chie65535様
いつもご回答ありがとうございます。

教えて頂いた方法だと、見出し(yyyy年mm月)の箇所が固定に
なってしまうかと思います。
例えば、今月11月に処理を実行する場合、前月(10月)から過去12ヵ月分で
抽出しなければなりません。

説明不足で申し訳ございませんでした。

今回質問させて頂いたクロス集計クエリも、元テーブルをUNIONクエリにして
それをクロス集計しております。
※元テーブルが、yyyy年mm月、商品数、顧客数、拠点ID
 というように、商品数と顧客数が横並びになっている為。

お礼日時:2014/11/04 13:18

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【Accessで困っています】クロス集計の列見出し

お世話になります。

クロス集計後の列見出しの並び替えですが
2009下期,2009上期,2008年下期・・・・・と
下期、上期と並べたいのですが、上期,下期と並んでしまいます。
クエリプロパティで設定すればいいのですが、たくさんあるので、【関数】かSQL文でのやり方をご存知の方教えて下さい。よろしくお願いします。

Aベストアンサー

回答がないようですが、解決されましたでしょうか。

このクエリはどこに使うのでしょうか。

ただ単にクエリを表示するだけであれば、表示後、列を移動して保存すれば以降その状態で見ることができるようです。
但し、このクエリを使ってExcelにエクスポートしたりするのなら、列の並びが元の状態になるようです。

> クエリプロパティで設定すればいいのですが
「クエリ列見出し」での設定と思います。

ここで設定した並び順で、列が表示されるようです。
(Excelへのエクスポートでも有効みたい)
(クエリをSQLビューで見た時、PIVOT xxx In (yyyy) の yyyy 部分になります)


そこで、抽出期間を指定してクエリを作り直すVBA処理を作りこみます。

確認用環境)

テーブル「T9」

以下サンプル (an はオートナンバ)
an   場所  日付      数量
1   AAA  2009/04/01   94     
2   AAA  2009/03/01   93     
3   BBB  2009/04/01   94     
4   BBB  2009/03/01   93     
5   AAA  2010/03/01   103     
6   AAA  2010/04/01   104     

クエリ「Q9」

TRANSFORM Sum(T9.数量) AS 数量の合計
SELECT T9.場所
FROM T9
GROUP BY T9.場所
PIVOT Year(DateAdd("m",-3,T9.日付)) & IIf(Month(DateAdd("m",-3,T9.日付))<=6,"上期","下期");

クエリの表示結果

場所  2008下期  2009下期  2009上期  2010上期
AAA    93      103      94      104
BBB    93     (空白)     94     (空白) 


やりたいクエリは、

TRANSFORM Sum(T9.数量) AS 数量の合計
SELECT T9.場所
FROM T9
GROUP BY T9.場所
PIVOT Year(DateAdd("m",-3,T9.日付)) & IIf(Month(DateAdd("m",-3,T9.日付))<=6,"上期","下期") In ('2010上期','2009下期','2009上期','2008下期');

の結果は、

場所  2010上期  2009下期  2009上期  2008下期
AAA    104      103     94      93
BBB   (空白)    (空白)    94      93


クエリ「Q9」との違いは、PIVOT の最後に、In (yyyy) があることだけ。

年と上期/下期を指定して作りこもうとしていますが、どうせならクエリの抽出条件に日付の範囲を指定できるようにしておきます。
基本的なクエリ「Q9_B」を作成しておいて、そのクエリの内容を書き換えたものを「Q9」に設定し直す方法としてみます。
「Q9_B」の内容は置き換えが楽なように作っておきます。
(クエリ「Q9」は存在する前提とします)

基本クエリ「Q9_B」の内容

TRANSFORM Sum(T9.数量) AS 数量の合計
SELECT T9.場所
FROM T9
WHERE T9.日付 BETWEEN #XXXX# AND #YYYY#
GROUP BY T9.場所
PIVOT Year(DateAdd("m",-3,T9.日付)) & IIf(Month(DateAdd("m",-3,T9.日付))<=6,"上期","下期") In (ZZZZ);

ここでの、XXXX/YYYY/ZZZZ を条件に合わせて書き換えたものを「Q9」に設定します。

設定用関数例)

Private Sub MakeBetweenQuery_Q9(dt_s As Date, dt_e As Date)
  Dim wdt As Date
  Dim sTmp As String
  Dim sTmp2 As String
  Dim sSql As String

  wdt = dt_s
  sTmp = ""
  While (wdt <= dt_e)
    If (Month(DateAdd("m", -3, wdt)) <= 6) Then
      sTmp2 = "上期"
    Else
      sTmp2 = "下期"
    End If
    sTmp = ",'" & Year(DateAdd("m", -3, wdt)) & sTmp2 & "'" & sTmp
    wdt = DateAdd("m", 6, wdt)
  Wend

  If (Month(DateAdd("m", -3, dt_e)) <= 6) Then
    If (sTmp2 = "下期") Then
      sTmp2 = "上期"
    Else
      sTmp2 = ""
    End If
  Else
    If (sTmp2 = "上期") Then
      sTmp2 = "下期"
    Else
      sTmp2 = ""
    End If
  End If
  If (Len(sTmp2) > 0) Then
    sTmp = ",'" & Year(DateAdd("m", -3, dt_e)) & sTmp2 & "'" & sTmp
  End If

  sSql = CurrentDb.QueryDefs("Q9_B").SQL
  sSql = Replace(sSql, "XXXX", Format(dt_s, "yyyy/mm/dd"))
  sSql = Replace(sSql, "YYYY", Format(dt_e, "yyyy/mm/dd"))
  sSql = Replace(sSql, "ZZZZ", Mid(sTmp, 2))
  CurrentDb.QueryDefs("Q9").SQL = sSql
End Sub


使用例)

抽出期間(日付)を指定する場合、

Private Sub Sample1()
  Call MakeBetweenQuery_Q9(#10/1/2008#, #3/31/2010#)
End Sub

これを実行すると、クエリ「Q9」は以下の内容となります。

TRANSFORM Sum(T9.数量) AS 数量の合計
SELECT T9.場所
FROM T9
WHERE T9.日付 BETWEEN #2008/10/01# AND #2010/03/31#
GROUP BY T9.場所
PIVOT Year(DateAdd("m",-3,T9.日付)) & IIf(Month(DateAdd("m",-3,T9.日付))<=6,"上期","下期") In ('2009下期','2009上期','2008下期');


テーブル「T9」全てを対象とする場合、

Private Sub Sample2()
  Call MakeBetweenQuery_Q9(DMin("日付", "T9"), DMax("日付", "T9"))
End Sub

これを実行すると、クエリ「Q9」は以下の内容となります。

TRANSFORM Sum(T9.数量) AS 数量の合計
SELECT T9.場所
FROM T9
WHERE T9.日付 BETWEEN #2009/03/01# AND #2010/04/01#
GROUP BY T9.場所
PIVOT Year(DateAdd("m",-3,T9.日付)) & IIf(Month(DateAdd("m",-3,T9.日付))<=6,"上期","下期") In ('2010上期','2009下期','2009上期','2008下期');


※ 関数名は適宜変更してください

※ 細かいところまで確認していませんので、おかしなところがあればドンドン修正してください。


※ こういうことでなかったら、スルーしてください。

回答がないようですが、解決されましたでしょうか。

このクエリはどこに使うのでしょうか。

ただ単にクエリを表示するだけであれば、表示後、列を移動して保存すれば以降その状態で見ることができるようです。
但し、このクエリを使ってExcelにエクスポートしたりするのなら、列の並びが元の状態になるようです。

> クエリプロパティで設定すればいいのですが
「クエリ列見出し」での設定と思います。

ここで設定した並び順で、列が表示されるようです。
(Excelへのエクスポートでも有効みたい)
...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qクロス集計クエリの結果をテーブルにしたい

こんにちは。ACCESS 97、ほぼ初心者です。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1445032
こちら様の質問の、便乗質問です(質問者様とは関係ありません)。

品番,倉庫,数量
4944,F,190
4960,A,25
4960,B,6
4960,C,72
4960,D,20
4960,E,50
4960,F,3
4962,C,26
4962,E,4
4963,C,5
4964,A,4
4964,C,148
4964,E,42
4965,A,2
4965,C,5
4965,E,1
4966,C,4
4966,E,1

こんなデータからテーブルを作成し、クロス集計クエリで

品番 A B C D E F
4944 190
4960 25 6 72 20 50 3
4962 26 4
4963 5
4964 4 148 42
4965 2 5 1
4966 4 1

という結果を出し、上の質問の方法でテーブル作成すると、元データと同じテーブルが作成されます。
A、B、C、D、E、Fを列見出しにしたテーブルを作成したいのですが、教えてください。

こんにちは。ACCESS 97、ほぼ初心者です。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1445032
こちら様の質問の、便乗質問です(質問者様とは関係ありません)。

品番,倉庫,数量
4944,F,190
4960,A,25
4960,B,6
4960,C,72
4960,D,20
4960,E,50
4960,F,3
4962,C,26
4962,E,4
4963,C,5
4964,A,4
4964,C,148
4964,E,42
4965,A,2
4965,C,5
4965,E,1
4966,C,4
4966,E,1

こんなデータからテーブルを作成し、クロス集計クエリで

品番 A B C D E F
4944 190
4960 2...続きを読む

Aベストアンサー

<クロス集計クエリのテーブル化>
ファイル
外部データの取り込み
インポート
クエリ
(クエリ名)在庫のクロス集計
オプション
クエリのインポート
テーブルとしてインポート
OK
でできましたが、やってみてください。
普通のクエリのテーブル作成クエリではできなかった。
(断定にはやや不安あり)
http://www20.big.or.jp/~o-shin/bbs/bender/sql/pslg5447.html
なおクエリをコピーして、テーブルに貼り付けるのもできた・

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESSで縦に並んだテーブルデータを横に並べることは出来ますか?

お世話になります。現在大量にデータを前に悩んでいます。

テーブルに以下のようなデータがあります。

| 薬剤名 | 効果 |
-----------------------
| A剤  | 頭痛 |
| A剤  |生理痛 |
| A剤  | 発熱 |
| B剤  | 歯痛 |
| B剤  |生理痛 |
| C剤  | 頭痛 |

これを、薬剤名ごとにまとめ効果を横へ並べる。

| 薬剤名 |効果1|効果2|効果3|効果4|
-------------------------------------------
| A剤  | 頭痛 |生理痛| 発熱 | |
| B剤  | 歯痛 |生理痛|   | |
| C剤  | 頭痛 |   |   | |

ことって出来るのでしょうか?
効果の数はいくつになるか分かりません。現在は最大7つですが、今後それ以上の物が出る可能性もあります。

ACCESSでは無理なことでしょうか?

また、ACCESSのバージョンは2002です。なお、ACCESSについては、使用法を含め初心者に毛が生えたくらいの知識しかありません。申し訳ありませんが「サル」にもわかるくらいの優しさでご指導願えれば幸いです。

よろしくお願いします。

お世話になります。現在大量にデータを前に悩んでいます。

テーブルに以下のようなデータがあります。

| 薬剤名 | 効果 |
-----------------------
| A剤  | 頭痛 |
| A剤  |生理痛 |
| A剤  | 発熱 |
| B剤  | 歯痛 |
| B剤  |生理痛 |
| C剤  | 頭痛 |

これを、薬剤名ごとにまとめ効果を横へ並べる。

| 薬剤名 |効果1|効果2|効果3|効果4|
-------------------------------------------
| A剤  | 頭痛 |生理痛| 発熱 ...続きを読む

Aベストアンサー

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか?

・<薬剤別効果一覧>テーブルをクリアする。
・<薬剤別効果情報>を取得する。
・<薬剤別効果一覧>テーブルに追加する。

一種の一時テーブルを作成するということです。
これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。

*少し、ADO を利用することになります。コードはサワリだけ。

薬剤名 効果総数 効果名_1 効果名_2 効果名_3
A剤   3    頭痛   生理痛  発熱

このように、<薬剤別効果一覧>テーブルにデータを登録するコードは以外と簡単です。

Private Sub コマンド_薬剤別効果一覧追加_Click()
  Dim isOK  As Boolean
  Dim strSQL As String
  
  isOK = CnnExecute("DELETE FROM 薬剤別効果一覧")
  If isOK Then
    strSQL = "INSERT INTO 薬剤別効果一覧 " & _
         "(薬剤名, 効果総数, 効果名_1, 効果名_2, 効果名_3)" & _
         " Values " & _
         "('A剤', 3, '頭痛', '生理痛', '発熱')"
    isOK = CnnExecute(strSQL)
    If isOK Then
      MsgBox "[薬剤別効果一覧] にデータを追加しました。"
    End If
  End If
End Sub

僅かに、CnnExecute()を自作ライブラリに追加するだけで、このように読めば判るコードが書けます。
これならば、質問者にとっても別に難しいことではないと思います。
SQL文は、Accessプロジェクトのそれですので Jetとは違うかも知れませんが基本は同じです。
課題は、strSQL の生成にあります。
ここが一つにハードルです。
まあ、それも含めて書くと、一つのプロシージャ全体を請け負うことになりますのでチョットです。

質問レベルからして、いずれ、この領域に踏み込む必要ありと感じましたので・・・。

Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
   MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & CnnErrors.Description & Chr$(13) & _
      "・Err.Number=" & CnnErrors.Number & Chr$(13) & _
      "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
      "・SQL Text=" & strSQL, _
      vbExclamation, " ADO関数エラーメッセージ"
End Sub

Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
   Dim isOK As Boolean
   Dim cnn As ADODB.Connection
  
   isOK = True
   Set cnn = CurrentProject.Connection
   With cnn
     .Errors.Clear
     .BeginTrans
     .Execute strSQL
     .CommitTrans
   End With
Exit_CnnExecute:
On Error Resume Next
   cnn.Close
   Set cnn = Nothing
   CnnExecute = isOK
   Exit Function
Err_CnnExecute:
   isOK = False
   If cnn.Errors.Count > 0 Then
     ErrMessage cnn.Errors(0), strSQL
     cnn.RollbackTrans
   Else
     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
        vbExclamation, " 関数エラーメッセージ"
   End If
   Resume Exit_CnnExecute
End Function

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか?

・<薬剤別効果一覧>テーブルをクリアする。
・<薬剤別効果情報>を取得する。
・<薬剤別効果一覧>テーブルに追加する。

一種の一時テーブルを作成するということです。
これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。

*少し、ADO を利用することになります。コードはサワリだけ。

薬剤名 効果総数 効果名_1 効果名_2 効果名_3
A剤   3    頭痛   生理痛  発熱

この...続きを読む

QACCESS 一番最新の日付の金額を出したいのですが・・

社員ID/交通費/登録日 のフィールドがあるテーブルがあります。

社員ID/交通費/登録日
0001  800  2007/4/1
0002  400  2007/4/2


0001 700  2007/5/2

となった場合、0001の人は700円と言う風に登録日が最新のものを抽出したいのですが

クエリをつくり登録日の集計を「最大」にしてみたら、日付は5/2がちゃんと出ますが、金額がその登録日以外の金額になるのです。

どうすればよいでしょうか?
分かる方教えて下さい。宜しくお願いします。

 

Aベストアンサー

SQL文とクエリは同じです。

フィールド:登録日
テーブル:TEST
並び替え:
表示:
抽出条件:DLOOKUP("MAX(登録日)","TEST","社員ID=" & 社員ID);
または:

フィールド:登録日
テーブル:TEST
並び替え:
表示:
抽出条件:(SELECT MAX(登録日) FROM TEST AS B WHERE TEST.社員ID=B.社員ID)
または:

このように、クエリを編集すれば良いということです。
ですから、事実上は、"TEST" だけを実際のテーブル名、クエリ名に置き換えるだけです。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESS  クロス集計クエリの抽出条件について

http://www.accessclub.jp/samplefile/samplefile_39.htm

上記サイトのクロス集計クエリのやり方で、抽出条件を

Between [Forms]![フォーム1]![開始日] And [Forms]![フォーム2]![終了日]

とする場合、
クエリパラメータダイアログにはどう記述したらよいのでしょうか?

[Forms]![フォーム1]![開始日]と[Forms]![フォーム2]![終了日]をそれぞれ別々にテキスト型としてもエラーですし、(「式が複雑です」とのエラー)
条件を全て記述しても、「かっこの使い方が正しくありません。」とのエラーです。

何が間違っているのでしょうか?

Aベストアンサー

日付関係の項目がすべて同じ属性ですか
・・・テーブルもフォームも・・・・・
(テキストならテキストで統一、DATE型ならDATE型)
------------------------------------------------------
フォーム2となっていますがフォーム1ではないのでしょうか
------------------------------------------------------
どうしてもエラーならば、クエリーを2つに分ける
・選択クエリーでセレクト指定する
・次にクロス集計クエリー
など

QAccess 複数のクエリの結果をひとつの表にまとめたいのですが

Access2002の初心者です。
健康診断の結果の個別の検査数値から異常値の人数を、部署ごとにカウントするクエリを検査の数だけつくりました。これをひとつの表としてクエリでまとめたいのですが、うまくいきません。
イメージとして

クエリ1 血圧
A部署  2人
B部署  1人
C部署  3人

クエリ2 血糖値
A部署  4人
B部署  2人
C部署  1人

↓↓このようにまとめたいのですが
    体重 血糖値
A部署 2人  4人
B部署 1人  2人
C部署 3人  1人

よろしくおねがいいたします。

Aベストアンサー

クエリ1、クエリ2をクエリデザインビューに取り込み、部署で結合するだけで
目的のものは得られますが

クエリ1、クエリ2と分けて結果を出さなくとも
クロス集計クエリで大元のテーブルからいきなり最終結果がでるはずですよ
クロス集計クエリについて勉強してみてください


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング