Microsoft Access 掲示板

クロス集計のSQL文のエラー

11 コメント
views
4 フォロー

よろしくお願いします。

ADOでSQLにてレコードセットを開こうとしています。

テーブル「tbl請求_合算Sub」(フィールドが多いので関連するフィールドのみ表示)
 合算請求書番号(主キー)
 SubID(主キー)
 請求単価
 合算請求書特殊行
 消費税率
 
コード
    Dim cn As New ADODB.Connection
    Dim rs_sub_total As New ADODB.Recordset
    Dim Num As String

    cn.Open  省略
    rs_sub_total.CursorLocation = adUseClient
    rs_subtotal.Open "TRANSFORM SUM(請求単価) AS 請求金額 " &
                    "SELECT 消費税率, SUM(請求単価) AS 請求金額 " & _
                    "FROM tbl請求合算Sub " &
                    "WHERE 合算請求書番号 = '" & Num & "' AND 消費税率 IS NOT NULL " &
                    "GROUP BY 消費税率 " &

                    "ORDER BY 消費税率 " &
                    "PIVOT 合算請求書特殊行;",

                    cn, adOpenKeyset, adLockOptimistic

請求単価付近に不適切な構文があります、とエラーになります。

構文は間違ってなさそうなので、よくわかりませんでした。

あん
作成: 2023/11/02 (木) 11:23:20
通報 ...
1
すずやん 2023/11/02 (木) 12:55:09

実行できないのでなんともいえませんが、下記リンク先の内容から考えるに、SELECT下の「SUM(請求単価) AS 請求金額」必要ないのかな、と思えます。

https://qiita.com/fuk101/items/731379d12cd7f5559fb2

2

1行目のクロス集計と
TRANSFORM SUM(請求単価) AS 請求金額
2行目の行集計
SUM(請求単価) AS 請求金額
のフィールド名が重複しているのがエラーの原因でしょう。

どちらかフィールド名を変更すればいいでしょう。

3
あん 2023/11/02 (木) 14:09:08 927ea@2928c

すずやん様
hatena様

ありがとうございます。

試してみましたが、
SELECT下の「SUM(請求単価) AS 請求金額」を削除しましたが、ダメでした。
一方のフィールド名を変えてみましたが、ダメでした。

4
hatena 2023/11/02 (木) 14:47:30 修正

構文エラーですね。
コードを下記に修正してみてください。

    Dim cn As New ADODB.Connection
    Dim rs_sub_total As New ADODB.Recordset
    Dim Num As String

    cn.Open 省略
    rs_sub_total.CursorLocation = adUseClient
    rs_sub_total.Open "TRANSFORM SUM(請求単価) AS クロス請求金額 " & _
                     "SELECT 消費税率, SUM(請求単価) AS 請求金額 " & _
                     "FROM tbl請求合算Sub " & _
                     "WHERE 合算請求書番号 = '" & Num & "' AND 消費税率 IS NOT NULL " & _
                     "GROUP BY 消費税率 " & _
                     "ORDER BY 消費税率 " & _
                     "PIVOT 合算請求書特殊行;", _
                     cn, adOpenKeyset, adLockOptimistic

1つのコマンド文を改行して記述するときは、行末に 「 _」 (半角スペース+アンダーバー)が必要です。
あと、変数名も途中から間違ってますね。

5
あん 2023/11/02 (木) 14:54:32 927ea@2928c

hatena様

再度、ありがとうございます。
「 _」は全箇所に既に入っております。なぜかサイトの投稿では消えてしまっています。
それと、フィールド名を「クロス請求金額」、「請求金額」にも変更しましたが、同じエラーが出てしまいます。

6
あん 2023/11/02 (木) 15:09:00 修正 927ea@2928c

コードを貼り付けさせていただきました。
ただ、"FROM tbl請求合算Sub " &   を
"FROM tbl請求_合算Sub " &
  に変更しました。(_は実際は半角です。なぜか投稿するとなくなってしまうので全角にしました。)

それでもエラーが出てしまいます。
ADOではクロス集計は出来ないのでしょうか?

7

まずは、
クエリのデザインビューでご希望の結果になるものを作成して、SQLビューにして、
それとVBAに記述したSQL文に違いがないか確認してみてください。


それで解決しない場合は、

「 _」は全箇所に既に入っております。なぜかサイトの投稿では消えてしまっています。

コード文はマークダウン記法のコードブロック内にいれてください。
詳細は下記のページを参照ください。

Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa

コードをコードブロック内に入れたものを投稿してください。

それと、フィールド名を「クロス請求金額」、「請求金額」にも変更しましたが、同じエラーが出てしまいます。

そのエラーメッセージを正確に提示してください。
「合算請求書番号」フィールドのデータ型も提示してください。

9
あん 2023/11/02 (木) 16:05:47 修正 927ea@2928c >> 7

クエリのSQLビューにて確認しました。
SELECT文のところで、「SUM(請求単価) AS 請求金額」が不要だったので削除しましたが、同じエラーが出ます。

cnの省略も省略せずに載せます。


    cn.Open "Provider=SQLOLEDB;Data Source=SQLサーバー名;Initial Catalog=" & DLookup("データベース名", "tblデータベース") & ";User ID=ID;Password=PASSWORD;"
    rs_sub_total.CursorLocation = adUseClient
    rs_sub_total.Open "TRANSFORM SUM(請求単価) AS クロス請求金額 " & _
                        "SELECT 消費税率 " & _
                        "FROM tbl請求_合算Sub " & _
                        "WHERE 合算請求書番号 = '" & Num & "' AND 消費税率 IS NOT NULL " & _
                        "GROUP BY 消費税率 " & _
                        "ORDER BY 消費税率 " & _
                        "PIVOT 合算請求書特殊行;", _
                        cn, adOpenKeyset, adLockOptimistic

エラーメッセージは、
実行時エラー '-2147217900(80040e14)':
'請求単価' 付近に不適切な構文があります。

合算請求書番号のデータ型は「短いテキスト」です。SQLサーバーリンクで、サーバーの方の型は「nvarchar(255)」です。

よろしくお願いします。

8
すずやん 2023/11/02 (木) 15:43:25

たぶんですが、SQL Serevrでは「TRANSFORM」を使ったクロス集計ができないと思われます(間違っていたらすみません)
ネットで検索してもSQL Serevrを使用した例が出てきません。

SQL Serevrの場合は下記のような手法で行うのではないでしょうか。
https://style.potepan.com/articles/25072.html

10
あん 2023/11/02 (木) 16:12:04 修正 927ea@2928c

すずやん様

調べていただき、ありがとうございます。

SQL Serverでは出来ないのですかね。

ADOでSQL Serverを直接見に行っているので、それをAccessのリンクテーブルを見に行くように変更すればできるか試してみます。

ちなみに、ご提示いただいたリンク先のコード記述をVBAで出来るのでしょうか?

11
あん 2023/11/02 (木) 16:57:59 927ea@2928c

hatena様
すずやん様

出来ました!

Accessリンクテーブル参照のADO接続で出来ました。

やはりSQL Server参照のADO接続ではできませんでした。

大変ありがとうございました。