【问题标题】:Concatenate 2 rows in a complex SQL query在复杂的 SQL 查询中连接 2 行
【发布时间】:2012-10-20 23:14:24
【问题描述】:

我将 MS-Access 2003 与查询创建器一起使用。我从一张表 (FaitsSaillants) 中选择所有内容,然后从另一张表 (tb_SOMMAIRE) 中选择一个特定行 (WHERE VARIABLE='TitreMandat')。我想从第二个表中选择另一行并将其连接起来。

查询

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;

此查询确实添加了 ID(OTP 字段)匹配的 tb_SOMMAIRE.Valeur 字段以及 tb_SOMMAIRE.VARIABLE='TitreMandat' 的位置。它就像一个魅力。但是,我想在 tb_SOMMAIRE 结果中添加另一行。我想得到VARIABLE='TitreMandat' 所在的行(该部分实际上正在工作)和VARIABLE='NomInstallation' 所在的行。我将得到 2 行,当我要求 Projet (tb_SOMMAIRE.Value as Projet) 时,我希望将这 2 行连接起来并显示。两行的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

【问题讨论】:

  • 显示一些示例数据和示例结果

标签: sql ms-access concatenation


【解决方案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 视图)中,以检查返回的行是否符合预期。

【讨论】:

  • 即使只有5个参数也报错说需要输入6。第6个参数是q.value???
  • 另一个错误消息。它是法语的,但基本上,它说语法不正确或太复杂而无法评估。它建议将 parts 分配给 variables。但是,查询似乎在设计窗口中正确呈现,它是在执行时收到错误消息的。顺便感谢您的帮助,非常感谢。
  • 这是一个不同的问题。 faitssaillants 是表还是查询?如果它是一个可能是问题的查询,您将需要发布 sql。如果没有,您需要在问题中包含有关您的表结构和数据的更多信息。
  • 没有。在某个阶段,您必须继续前进,但是,您可以在查询设计窗口中引用一个查询,因此您可以使用在查询设计窗口中创建的三个查询来构建它。这不是了解所涉及的 SQL 的最坏方法。一旦你有了这三个查询,你就可以开始用 SQL 替换查询的名称来创建一个派生表。
猜你喜欢
  • 2010-11-02
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多