質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • Access

    378questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Access クエリの解析

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 322

shimpei

score 5

お世話になっております。
AccessおよびSQL初心者なので、教えてください。

Accessのクエリの解析について、ご教授下さい。
以下のクエリを投げたところ、
レコードによって、「UsageType.detail」がNullになる場合があります。

■質問内容
detailカラム自体は、Nullの項目がないのですが、
なぜ、レコードによって、Nullが発生しているか原因を確認しております。

・質問1:
Nullにならないように、抽出させたいです。
そのため、Group Byなどの集計関数を削った方がいいのであれば、それが可能なクエリを教えて頂けないでしょうか。

・質問2:
From句が複雑でなかなか理解できないため、クエリを分けられるのであれば、
分けたverのクエリを教えていただけないでしょうか。(※理解を深めたいため)

■クエリ

SELECT 
    [アカウントマスタ].Custmer_Number,
    [アカウントマスタ].Customer_Name,
    詳細課金データ_With_ResourceID.[user:Name] AS Name, 
    詳細課金データ_With_ResourceID.ProductName, 
    UsageType.detail, 
    Sum(詳細課金データ_With_ResourceID.UsageQuantity) AS 利用量, 
    UsageType.unit AS 単位, 
    Sum(詳細課金データ_With_ResourceID.UnBlendedCost) AS 利用料金
FROM 
    (UsageType 
        RIGHT JOIN 
            (アカウントマスタ INNER JOIN 詳細課金データ_With_ResourceID ON [アカウントマスタ].AWS_Account = 詳細課金データ_With_ResourceID.LinkedAccountId) ON UsageType.key = 詳細課金データ_With_ResourceID.UsageType) 
        LEFT JOIN 
            UsageType変換マスタ ON UsageType.key = UsageType変換マスタ.UsageType
WHERE 
    (((詳細課金データ_With_ResourceID.ItemDescription) Not Like "*AWS Reseller Program Discount*" And (詳細課金データ_With_ResourceID.ItemDescription) 
                                                      Not Like "*PAR_APN_ProgramFee*" And (詳細課金データ_With_ResourceID.ItemDescription) 
                                                      Not Like "*AWS_Developer_Tools_Survey*" And (詳細課金データ_With_ResourceID.ItemDescription) 
                                                      Not Like "*SFST_SFxT_Incentives*"))
GROUP BY
    [アカウントマスタ].Custmer_Number, 
    [アカウントマスタ].Customer_Name, 
    詳細課金データ_With_ResourceID.[user:Name], 
    詳細課金データ_With_ResourceID.ProductName, 
    UsageType.detail, 
    UsageType.unit, 
    詳細課金データ_With_ResourceID.LinkedAccountId
HAVING
    (((詳細課金データ_With_ResourceID.ProductName) Is Not Null) AND ((詳細課金データ_With_ResourceID.LinkedAccountId)=154946556956));

■各テーブル構成
TBL_アカウントマスタ

フィールド名 データ型 サイズ
AWS_Account 12 数値型
Custmer_Number 8 数値型
Customer_Name 255 テキスト型
ecplus 1 数値型

TBL_Usagetype

フィールド名 データ型 サイズ
ID - オートナンバー型
key 255 テキスト型
detail 255 テキスト型
region_name 255 テキスト型
unit 255 テキスト型
active_flg 1 数値型

TBL_詳細課金データ_With_ResourceID

フィールド名 データ型 サイズ
ID - オートナンバー型
InvoiceID 255 テキスト型
PayerAccountId 12 テキスト型
LinkedAccountId 12 テキスト型
RecordType 255 テキスト型
RecordId 255 数値型
ProductName 255 テキスト型
RateId - テキスト型
SubscriptionId - テキスト型
PricingPlanId - テキスト型
UsageType 255 テキスト型
Operation 255 数値型
AvailabilityZone 255 テキスト型
ReservedInstance 255 テキスト型
ItemDescription 255 テキスト型
UsageStartDate yyyy/mm/dd 日付/時刻型
UsageEndDate yyyy/mm/dd 日付/時刻型
UsageQuantity - 数値型
BlendedRate - 数値型
BlendedCost - 数値型
UnBlendedRate - 数値型
UnBlendedCost - 数値型
ResourceId 255 テキスト型
user:Name 255 テキスト型
user:Project 255 テキスト型
user:Solution 255 テキスト型

お手数ですが、よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

さすがにこの複雑なSQLを文面だけで解析する気力はないので、一般論として。

RIGHT JOIN、LEFT JOIN の外部結合を使ってますが、その場合、結合しているフィールドの片方に一致するキーがないと、そのテーブル側のフィールドはNullになります。

Accessの不一致クエリをウィザードで作成すると、その性質を利用して、不一致レコードを取得してます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「NULLになってしまう」とありますが
基本的に「何かをしたい」からRIGHT JOIN、LEFT JOINを選択します。
つまり「NULLが出ること」は前提として折り込み済みでこれらの「外部結合」を選択します。

推測で申し訳ありませんが「あいまいな外部結合が含まれているので」等の
エラーメッセージで色々と変更してみた結果、今のJOIN句になっているのではないですか?

ともかくバックグラウンドやストーリーを知らないこちら側ではこのSQL文を見ても
どうしようもないかと思います。

本来やりたいことを頭の中でまとめて、SQLを理想形に近づけていくのがいいのでは。
多分ですがここらへんから始まると思います。

SELECT 
    詳細課金データ_With_ResourceID.LinkedAccountId AS アカウントID,
    詳細課金データ_With_ResourceID.UsageType AS 利用タイプ,
    Sum(詳細課金データ_With_ResourceID.UsageQuantity) AS 利用量, 
    Sum(詳細課金データ_With_ResourceID.UnBlendedCost) AS 利用料金
FROM 詳細課金データ_With_ResourceID
GROUP BY 詳細課金データ_With_ResourceID.LinkedAccountId,詳細課金データ_With_ResourceID.UsageType

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

駆動表は Right join で指定している部分になりますので、
詳細課金データ_With_ResourceID.UsageType
がNullであるかまたはUsageTypeに登録の無い値が設定されているかの何れかだと思います。
多分Nullなんでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Access

    378questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。