1

クエリ作成者でMS-Access2003を使用しています。1つのテーブル()からすべてを選択し、次に別のテーブル()からFaitsSaillants1つの特定の行( )を選択します。その2番目のテーブルから別の行を選択して連結します。WHERE VARIABLE='TitreMandat'tb_SOMMAIRE

クエリ

PARAMETERS
    [CurrAxe] Text ( 255 ), [CurrOTP] Text ( 255 ),
    [CurrClient] Text ( 255 ), [StartDate] DateTime, [EndDate] DateTime;
SELECT 
    tb_SOMMAIRE.Valeur AS Projet, tb_SOMMAIRE.VARIABLE, *
FROM
    (FaitsSaillants
     LEFT JOIN Employes
         ON FaitsSaillants.Utilisateur = Employes.CIP)
    INNER JOIN tb_SOMMAIRE
        ON FaitsSaillants.OTP = tb_SOMMAIRE.OTP
WHERE
    (((FaitsSaillants.OTP)=[CurrOTP]) AND 
     ((FaitsSaillants.Client) Like [CurrClient]) AND
     ((FaitsSaillants.Axe) Like [CurrAxe]) AND
     ((DateValue([DateInsertion]))>=[StartDate] AND
      (DateValue([DateInsertion]))<=[EndDate]) AND
     ((tb_SOMMAIRE.VARIABLE)='TitreMandat'))
ORDER BY
    FaitsSaillants.DateInsertion DESC;

tb_SOMMAIRE.Valeurこのクエリは、ID(OTPフィールド)が一致するフィールドと。を追加しますtb_SOMMAIRE.VARIABLE='TitreMandat'。それは魅力のように機能します。ただし、結果に別の行を追加したいと思いtb_SOMMAIREます。VARIABLE='TitreMandat'(その部分が実際に機能している)行と。の行を取得したいと思いVARIABLE='NomInstallation'ます。Projet2行を取得し、 ( )を要求したときに、それらの2行を連結して表示したいと思いますtb_SOMMAIRE.Value as Projet。両方の行OTP(ID)は、で選択したものと同じFaitsSaillantsです。

フランス語ならごめんなさい。

テーブルの構造

FaitsSaillants

Index AutoNumber
Projet Text
Axe Text
Client Text
OTP Text
FaitSaillant Memo
DateInsertion Date
Utilisateur Text

tb_SOMMAIRE

OTP Text
VARIABLE Text
Valeur Text

データ例

tb_SOMMAIRE

OTP   VARIABLE        Valeur
UGPSW NomInstallation PosteNemiscau
UGPSW TitreMandat     oscilloperturbographe
UGPSW RespIng         CU9656
GWIHK NomInstallation AnotherInstallation
GWIHK TitreMandat     Anytitle
GWIHK Responsable     ImportantPerson
4

1 に答える 1

1

どうですか:

PARAMETERS [CurrAxe] TEXT ( 255 ), [CurrOTP] TEXT ( 255 ), [CurrClient] TEXT (
255 ), [StartDate] DATETIME, [EndDate] DATETIME;

SELECT q.Projet, *
FROM   (faitssaillants f
LEFT JOIN employes e
ON f.utilisateur = e.cip)
INNER JOIN (
SELECT s1.otp,
     [s1].[valeur] & "," & [s2].[valeur] AS Projet
FROM   (
  SELECT otp, valeur
  FROM   tb_sommaire
  WHERE  [variable] = 'TitreMandat') AS s1
INNER JOIN (
   SELECT otp, valeur
   FROM   tb_sommaire 
   WHERE  [variable] = 'NomInstallation') AS s2
ON s1.otp = s2.otp) q
ON f.otp = q.otp
WHERE f.otp  = [currotp] 
AND f.client LIKE [currclient] 
AND f.axe LIKE [curraxe] 
AND Datevalue([dateinsertion]) 
    Between [startdate] And [enddate] 
ORDER  BY f.dateinsertion DESC; 

すべてのフィールドを*として参照することは常に避けるのが最善です。フィールド(列)は名前でリストする必要があります。

上記は、Otpによってtb_sommaireからの行をグループ化する派生テーブルの作成に依存しています。派生テーブルを切り取ってクエリデザイン画面(SQLビュー)に貼り付け、返される行が期待どおりであることを確認できます。

于 2012-10-31T13:29:21.107 に答える