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



我需要您在 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)

上面的代码给了我所有拥有属于他们的客户的家庭(他们的 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

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

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

由于每个家庭只有 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时返回记录,需要在C2LEFT JOIN

我没有在这里加入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)返回每HHID的最小CID和最大CIDMax(CID)

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

最新更新