0

2 つのクエリを 1 つの SQL サーバー パススルー クエリ (PTQ) に結合しようとしています。どちらのクエリも、Access で個別にコーディングすると機能します。これらのアクセス コードを 1 つのクエリに組み合わせても、Access で機能します。しかし、フィールド名を T-sql にフォーマットし、PTQ として実行しようとすると、「GROUP」の近くで構文エラーが発生します。この「GROUP BY」行を削除すると、「;」付近で構文エラーが発生します。

SELECT jaar, 
       maand, 
       wicode, 
       pg_intern_code, 
       pg_kriss_code, 
       pg_kriss_naam, 
       Count(pc0517.dbo.resul.klavnr) AS AantalVanKLAVNR 
FROM   (SELECT Year(pc0517.dbo.resul.created)  AS JAAR, 
               Month(pc0517.dbo.resul.created) AS MAAND, 
               pc0517.dbo.resul.wicode, 
               dbo.tblproductgroep_intern.pg_intern_code, 
               dbo.tblproductgroep_kriss.pg_kriss_code, 
               dbo.tblproductgroep_kriss.pg_kriss_naam, 
               pc0517.dbo.resul.klavnr 
        FROM   (dbo.tblproductgroep_kriss 
                INNER JOIN (dbo.tblproductgroep_intern 
                            INNER JOIN dbo.tblrobbe_pg 
                                    ON dbo.tblproductgroep_intern.pg_intern_id = 
                                       dbo.tblrobbe_pg.pg_code_intern_id) 
                        ON dbo.tblproductgroep_kriss.pg_kriss_id = 
                           dbo.tblrobbe_pg.pg_code_kriss_id) 
               INNER JOIN pc0517.dbo.resul 
                       ON dbo.tblrobbe_pg.robbe_pg_naam = 
                          pc0517.dbo.resul.prcode 
        WHERE  ( ( Year(pc0517.dbo.resul.created) = 2012 ) 
                 AND ( pc0517.dbo.resul.kanaal = "gg" ) )) 
GROUP  BY jaar, 
          maand, 
          wicode, 
          pg_intern_code, 
          pg_kriss_code, 
          pg_kriss_naam; 

同じデータベース (PC0517 データベースと組み合わせても) 上の他の PTQ は問題なく動作しますが、私は SQL サーバーにまったく慣れていないため、まだすべての規則を知っているわけではなく、おそらく基本的なものを見落としています.. .

ティア

4

1 に答える 1

2

I corrected a variety of things: (1) put the joins in the right order (2) removed misplaced parentheses (3) added table aliases for readability (4) removed double quotes around "gg"(5) made the query against r.created an openインデックスが存在する場合に使用できるように、範囲を終了しました。また、グループ化の内部クエリからも削除jaarしました。where 句に基づいて、これは2012.

そこに貼り付けた場合にAccessがこれをどうするかはわかりませんが、SQL Serverに対して直接実行することで、Accessが作成したガベージクエリよりも、これがより正しいクエリであることを確認できるはずです. それでも Access で問題が解決しない場合は、それを SQL Server のストアド プロシージャまたはビューに配置し、Access にその点を指示します。

SELECT 
   jaar = 2012, 
   maand, 
   wicode, 
   pg_intern_code, 
   pg_kriss_code, 
   pg_kriss_naam, 
   COUNT(klavnr) AS AantalVanKLAVNR 
FROM   
(
    SELECT 
       maand = MONTH(r.created), 
       r.wicode, 
       i.pg_intern_code, 
       k.pg_kriss_code, 
       k.pg_kriss_naam, 
       r.klavnr 
    FROM 
       dbo.tblproductgroep_kriss AS k
    INNER JOIN dbo.tblrobbe_pg AS tr 
       ON k.pg_kriss_id = tr.pg_code_kriss_id
    INNER JOIN dbo.tblproductgroep_intern AS i 
       ON i.pg_intern_id = tr.pg_code_intern_id
    INNER JOIN pc0517.dbo.resul AS r 
       ON tr.robbe_pg_naam = r.prcode 
    WHERE 
       r.created >= '20120101' AND r.created < '20130101'
       AND r.kanaal = 'gg'
) AS x 
GROUP BY 
   maand, 
   wicode, 
   pg_intern_code, 
   pg_kriss_code, 
   pg_kriss_naam; 

次のように簡略化することもできます。

    SELECT 
       jaar = 2012,
       maand = MONTH(r.created), 
       r.wicode, 
       i.pg_intern_code, 
       k.pg_kriss_code, 
       k.pg_kriss_naam, 
       r.klavnr 
    FROM 
       dbo.tblproductgroep_kriss AS k
    INNER JOIN dbo.tblrobbe_pg AS tr 
       ON k.pg_kriss_id = tr.pg_code_kriss_id
    INNER JOIN dbo.tblproductgroep_intern AS i 
       ON i.pg_intern_id = tr.pg_code_intern_id
    INNER JOIN pc0517.dbo.resul AS r 
       ON tr.robbe_pg_naam = r.prcode 
    WHERE 
       r.created >= '20120101' AND r.created < '20130101'
       AND r.kanaal = 'gg'
    GROUP BY 
       MONTH(r.created), 
       r.wicode, 
       i.pg_intern_code, 
       k.pg_kriss_code, 
       k.pg_kriss_naam; 

(つまり、サブクエリは不要のようです。)

于 2012-06-13T12:14:21.223 に答える