C#DataSet Designer - AccesDB - 将两行合并为一行

问题描述 投票:1回答:1

我需要你的SQL查询帮助,我试图在C#Dataset Query Builder中构建...

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的人出现在同一行,就像以后的数据网格视图一样:

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

我发现了大量非常相似的问题,但很少有人有同样的问题需要解决。那些(一个或两个)真的有同样的问题,它有一个解决方案,我只是无法扭曲我的问题。

非常感谢任何帮助......非常感谢,AD

c# sql ms-access-2016
1个回答
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表,因为我们只需要它的HHID,也可以在HouseHold_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将产生这两个客户。如果您只有一个客户端,那么MinMax都将返回相同的客户端。如果是这种情况,那么IIf将返回Null而不是Max(CID),以避免返回两次相同的客户端。

© www.soinside.com 2019 - 2024. All rights reserved.