C#数据集设计器-AccesDB-将两行合并为一

时间:2019-03-30 22:11:02

标签: c# sql ms-access-2016

我需要您的SQL查询帮助,我正在尝试使用C#数据集查询生成器进行构建...

SELECT HouseHold.HHID, Client.FIRST_NAME, Client.LAST_NAME 
FROM ((Client 
INNER JOIN HouseHold_Client ON Client.CID = HouseHold_Client.CID) 
INNER JOIN HouseHold ON HouseHold_Client.HHID = HouseHold.HHID)

上面的代码为我提供了所有属于客户的HouseHolds(其ID)的列表:

HHID  |  FIRST_NAME |  LAST_NAME
------------------------------
1     |  Penelope   |  Grant
1     |  Brian      |  Dyer
2     |  James      |  Newman
2     |  Richard    |  Parsons

..但是我不知道如何让属于同一HouseHold的人出现在同一行上,例如稍后在Data Grid View中这样:

HHID | I_FIRST_NAME | I_LAST_NAME | II_FIRST_NAME | II_LAST_NAME
-----------------------------------------------------------------
1    | Penelope     | Grant       | Brian         | Dyer
2    | James        | Newman      | Richard       | Parsons

我发现了很多非常相似的问题,但是很少有完全相同的问题需要解决。确实有相同问题并且有解决方案的人(一两个),我只是无法解决我的问题。

非常感谢任何帮助... 非常感谢你, 广告

1 个答案:

答案 0 :(得分:0)

由于每个家庭只有2个人,因此您可以使用该技巧获取每个家庭的最小和最大客户ID。这是在子查询中完成的。

SELECT
    X.HHID,
    C1.FIRST_NAME AS I_FIRST_NAME, C1.LAST_NAME AS I_LAST_NAME,
    C2.FIRST_NAME AS II_FIRST_NAME, C2.LAST_NAME AS II_LAST_NAME
FROM
    ((  SELECT
            HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
        FROM HouseHold_Client
        GROUP BY HHID
    ) X
    INNER JOIN Client AS C1
        ON X.MinCId = C1.CID)
    LEFT JOIN Client AS C2
        ON X.MaxCId = C2.CID;

IIf()表达式的目的是仅在最大客户端ID与最小客户端ID不同时才输出最大客户端ID。要在MaxCIdNull时也返回记录,则LEFT JOIN上需要C2

我没有在这里加入HouseHold表,因为我们只需要其中的HHIDHouseHold_Client中也有此表。如果您需要其他列,那么当然也可以将其加入。


子查询:

(  SELECT
        HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID))  AS MaxCId
    FROM HouseHold_Client
    GROUP BY HHID
) X

子查询必须用括号括起来并指定名称(此处为X)。 X充当普通表,在主查询中具有列HHIDMinCIdMaxCId。它按HHID分组。也就是说,它每HHID返回一行。 Min(CID)返回CID中最小的Max(CID)CID最大的HHID

如果每个HHID有2个客户端,这意味着MinMax将产生这2个客户端。如果您只有1个客户端,则MinMax都将返回相同的客户端。如果是这种情况,那么IIf将返回Null而不是Max(CID),以避免两次返回相同的客户端。