いつも参考にさせて頂いております。
クロス集計を行い、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;"
サンプルが本物のプログラムからコピペしてきてもらったという定義の元で。
"selectAtable.rID,Atable.shimei " & _
Selectの後にスペースが無いです。
GOD様
回答ありがとうございます。
本物のプログラムではスペースが存在しております。
紛らわしい記述にて申し訳ありません。
> 本物のプログラムではスペースが存在しております。
実際に使っているコードならまだしも、再現性の無いコードを書かれて、
それで「何が原因ですか」と聞かれても困りますよ。
VB付属のmdb(NWIND.MDB とか BIBLIO.MDB とか)を利用したコードなら、
回答側でも、容易に検証できますが……。
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
お手数をお掛けして申し訳有りません。
ご意見の程、宜しくお願い致します。
クロス集計ってAccessは出来るけど、SQL Serverでは
出来ないんじゃなかったっけ?
ちょっと調べてみたけど、TRANSFORMのかわりにVIEWを作成しなきゃ
いけないみたいですね。
↓の下の方に書いてあります。
http://www.microsoft.com/japan/technet/prodtechnol/sql/books/sqlmitgd.asp
LESIA様
回答ありがとうございます。
ご意見の通り、クロス集計は出来ないんですね・・・。
URLのページを参考にして、作成してみます!
ありがとうございました。
回答を頂いた皆様
不十分な質問に答えて頂きありがとうございました。
> データベースは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接続して処理するとか……。
遅かったか。(^^;
ツイート | ![]() |