【问题标题】:C# DataSet Designer - AccesDB - Combine two rows into oneC# 数据集设计器 - AccesDB - 将两行合二为一
【发布时间】:2019-03-30 22:11:01
【问题描述】:

我需要您的帮助来处理我正在尝试在 C# Dataset Query Builder 中构建的 SQL 查询...

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

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

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

【问题讨论】:

  • 每户最多2人吗?
  • 是的...最少 1 个,最多 2 个。谢谢...

标签: c# sql ms-access-2016


【解决方案1】:

由于每个家庭只有 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) 根据HHID 返回最小的CIDMax(CID) 最大的CID

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

【讨论】:

  • 嗨 Olivier... 您的解决方案正是我所需要的。对我来说还是太理解了... 做得好,谢谢.. Designer 为什么说:“向导在配置 TableAdapter 时检测到以下问题:'Fill'。详细信息:!生成的 SELECT 语句。列表中的错误函数参数 '=' 不被识别”。,同样关于 ')' 和 'LEFT'。 “无法解析查询文本。” ?虽然它给了我这一切,但它给了我预期的结果......再次非常感谢......
  • 有时手动构建的命令只能在SQL视图中查看,而不能在设计器视图中查看。
猜你喜欢
  • 2016-02-06
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2014-09-04
相关资源
最近更新 更多