2017-07-28 17 views
0

新規SQL with SQL。私は同じブックのシートに格納されているテーブルから動的ピボットクエリをテストするためにExcel VBAを介してクエリ文字列を介してSQLコードを実行しようとしています。通常のクエリは完全に(SELECT)動作していますが、SQL文は正しく動作していません。Excel VBA(クエリテーブル同じブック)のクエリ文字列を使用してSQLプロシージャコードを実行します。

私は私が達成したい何を、何度も何度も

Invalid SQL statement expected; 'DELETE','INSERT' ...エラーを受け取るには、動的なピボット(変数の列に行)を取得するためのSQLクエリです。私はピボットテーブルでこれを達成したくありません。私はVBAのSQL文字列クエリでそれをやりたいと思います。これを行うことができますどのように

Sample data

On Error GoTo ErrorConexion 
    objAdoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=" & ThisWorkbook.path & "\" & ThisWorkbook.Name & ";" & _ 
    "Extended Properties=""Excel 8.0;HDR=YES;FMT=Delimited; IMEX=1;""" 

    strSQL = "SET NOCOUNT ON " & Chr(13) _ 
     & "CREATE TABLE #tempdata(tmpf1 date, tmpf2 int)" _ 
     & " INSERT INTO #tempdata(tmpf1,tmpf2)" _ 
     & " SELECT [DATE], [AMOUNT] FROM " & GetTableRange(StrTable) 

    On Error GoTo ErrorSQL 
    objAdoRS.Open strSQL, objAdoConn 

私はこのようなコードを実行したいと思います:

DECLARE @Category AS VARCHAR(MAX) 
SELECT @Category = 
    COALESCE(@Category + ', ', '') + CAST(Category AS VARCHAR(20)) 
    FROM (SELECT DISTINCT Category FROM mytable) Books 
DECLARE @DynamicPIVOT AS VARCHAR(MAX) 
SELECT @DynamicPIVOT = 'SELECT ' + @Category + 
' FROM (
    SELECT amount, Category FROM mytable 
) Books 
PIVOT (
    MAX(amount) FOR Category IN (' + @Category + ') 
) Result;' 

EXEC (@DynamicPIVOT) 

よろしく、 ヴィンスを。

+0

異なるSQLエンジンと異なる方針のSQL Serverストアドプロシージャ(複雑な動的ピボット)をJet/ACEで複製しようとしています。さらに、ストアドプロシージャのように、ADOを使用して1回の呼び出しで複数のSQLコマンドを送信することはできません。データと希望する出力を表示してください。 – Parfait

+0

ありがとうパフェ、私は多くの環境に混じっています。サンプルデータを追加しました。 – Vince

答えて

0

単に動的ピボットクエリを実行するためにcrosstab queryJET/ACE SQLの非常に自身を使用しています。

strSQL = "TRANSFORM MAX(t.[AMOUNT]) AS MaxAmount" _ 
      & " SELECT t.[DATE] " _ 
      & " FROM [SheetName$] t" _ 
      & " GROUP BY t.[DATE]" _ 
      & " PIVOT t.[PEOPLE]" 

注意:255個の制限があります。 PEOPLEが254を超える場合、調整が必要です。

+0

驚くばかりのパーツ。それは "すべてのユニオン"ステートメントで行うことができますか?私は最初に、いくつかのテーブルからのすべてのデータを結合してから、クロス集計を行い、すべて同じクエリ内にあることを意味します。タクシー – Vince

+0

私はすでにUNION ALLでそれを行う方法を見つけました。ストアプロシージャを使用せずにピボット動的クエリを作成するための単純なソリューションこのデータを見るために数時間を費やしました。ありがとうございました。 – Vince

+0

偉大な、助けてうれしい!このクロス集計クエリは、Jet/ACE(MS Access dbs、Excel wbs)のみで使用でき、SQL Serverのような他のRDBMSは使用できないことを覚えておいてください。そして、この解決策を受け入れて解決策を確認してください。 – Parfait

0

これを試しましたか?一時テーブルを作成し、挿入して選択するよりもずっと簡単です。 1つのselect文でtempテーブルに直接挿入しています。

& "SELECT [DATE], [AMOUNT] INTO #TempData FROM " & 
    GetTableRange(StrTable) 
+0

Isaiahありがとうございますが、動作しません。 – Vince