実行時エラーについて

解決


飴玉  2005-02-02 18:53:31  No: 119366

いつも参考にさせて頂いております。

クロス集計を行い、VBのDataGridに表示したいと思っています。
SQL文を下記のようにしているのですが・・
実行すると、『実行時エラー -214721790(80040e14)  無効な構文・・・』という
エラーメッセージが表示されてしまいます。
Accessにて処理を行うと上手くいくのですが、何が原因なのでしょうか?

ご指導の程、宜しくお願い致します。

     SQL="transform sum(Atable.suuryou) as suuryou " & _
           "selectAtable.rID,Atable.shimei " & _
           "from Btable " & _
           "inner join Atable on Btable.cID = Atable.cID " & _
           "where ((Atable.syori=2)) " & _
           "group by Atable.rID,Atable.shimei " & _
           "pivot Btable.cID;"


GOD  2005-02-02 19:53:36  No: 119367

サンプルが本物のプログラムからコピペしてきてもらったという定義の元で。
"selectAtable.rID,Atable.shimei " & _
Selectの後にスペースが無いです。


飴玉  2005-02-02 20:04:23  No: 119368

GOD様

回答ありがとうございます。
本物のプログラムではスペースが存在しております。
紛らわしい記述にて申し訳ありません。


Dental  2005-02-02 20:54:16  No: 119369

> 本物のプログラムではスペースが存在しております。

実際に使っているコードならまだしも、再現性の無いコードを書かれて、
それで「何が原因ですか」と聞かれても困りますよ。

VB付属のmdb(NWIND.MDB とか BIBLIO.MDB とか)を利用したコードなら、
回答側でも、容易に検証できますが……。


飴玉  2005-02-03 00:20:08  No: 119370

Dental様

回答ありがとうございます。
実際のコードを記載します。
データベースはSQL server 7.0に存在しております。

Private Sub Command2_Click()
Dim strNaiyou As String
    strNaiyou = "TRANSFORM Sum(Atable.suuryou) AS suuryou " & _
                    "SELECT Atable.rID, Atable.shimei " & _
                    "FROM Btable INNER JOIN Atable ON Btable.cID = Atable.cID " & _
                    "Where (((Atable.syori) = 2)) " & _
                    "GROUP BY Atable.rID, Atable.shimei " & _
                    "PIVOT Btable.cID;"

Dim recNaiyou As ADODB.Recordset
Set recNaiyou = New ADODB.Recordset
    recNaiyou.Open strNaiyou, cnn, adOpenStatic, adLockPessimistic

Set DataGrid1.DataSource = recNaiyou
        DataGrid1.AllowAddNew = False
        DataGrid1.ScrollBars = dbgAutomatic

Set recNaiyou = Nothing
End Sub

お手数をお掛けして申し訳有りません。
ご意見の程、宜しくお願い致します。


LESIA  2005-02-03 00:27:05  No: 119371

クロス集計ってAccessは出来るけど、SQL Serverでは
出来ないんじゃなかったっけ?


LESIA  2005-02-03 00:36:27  No: 119372

ちょっと調べてみたけど、TRANSFORMのかわりにVIEWを作成しなきゃ
いけないみたいですね。
↓の下の方に書いてあります。
http://www.microsoft.com/japan/technet/prodtechnol/sql/books/sqlmitgd.asp


飴玉  2005-02-03 00:40:35  No: 119373

LESIA様

回答ありがとうございます。
ご意見の通り、クロス集計は出来ないんですね・・・。
URLのページを参考にして、作成してみます!

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

回答を頂いた皆様
不十分な質問に答えて頂きありがとうございました。


魔界の仮面弁士  2005-02-03 00:50:31  No: 119374

> データベースはSQL server 7.0に存在しております。
TRANSFORM は、JET SQL 用の構文ですね。
SQL Server / MSDE では使用できません。

# 7.0 って、キューブの作成できましたっけ?

クロス集計が必要なら、下記を参考にしてみてください。
CASE構文を利用して、クロス集計させる例が載っています。
http://www.microsoft.com/JAPAN/technet/prodtechnol/sql/books/sqlmitgd.asp?frame=true

もし、CASEを使っても処理できないほど複雑な構造になる場合には、
一時テーブル(先頭に#をつけたテーブル)を利用して、ストアドで処理するか、
もしくは、速度的低下を承知で、Jet経由でODBC接続して処理するとか……。


魔界の仮面弁士  2005-02-03 00:50:58  No: 119375

遅かったか。(^^;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加