在 2 个表之间使用内连接,对于 1 个特定列的多条记录,对整数列求和,使 varchar 列以逗号分隔
Posted
技术标签:
【中文标题】在 2 个表之间使用内连接,对于 1 个特定列的多条记录,对整数列求和,使 varchar 列以逗号分隔【英文标题】:Using inner join between 2 tables, For multiple records wrt 1 particular column, sum integer columns, make varchar columns comma separated 【发布时间】:2016-04-12 00:11:37 【问题描述】:我正在处理 2 张桌子。
下面是结构——
MainComponents (ComponentNo varchar(255), description varchar(255),cost float, Age int);
RevisedComponents(ComponentNo varchar(255), description varchar(255), cost float, Age int);
两个表的 componentNo 列可以有多个值。 所以,如果我做内部连接,我可以为每个 componentNo 获得多行。
我试图为每个 ComponentNo 只获取 1 行,描述列应该用逗号分隔(如果值不同),应该总结成本列,所有行的年龄都相同,所以选择任何行值。
样本输出数据 -
ComponentNo - AHGHGHHHK
Description - HW,SW
Cost - 100(50+50)
Age - 10
请帮忙。
谢谢
【问题讨论】:
请提供 MainComponents 和 RevisedComponents 的示例数据。确保它与您的示例输出相匹配。 嗨 Felix,MainComponent(AHGHGHHK, HW, 50, 10), RevisedComponents(AHGHGHHK, HW,50,10)(AHGHGHHK, SW, 50, 10)。我假设我会得到行这个组件 - AHGHGHHK 使用内部连接 嗨 Felix,假设我有 3 条记录。描述包括 - 硬件、硬件、软件。我怎样才能确保硬件只出现一次。请帮忙 【参考方案1】:首先,在两个表上执行JOIN
。要获取Cost
,请使用SUM
。要获取Age
,您可以使用MIN
或MAX
。然后使用FOR XML PATH
连接Description
:
SELECT
mc.ComponentNo,
x.Description,
Cost = SUM(rc.Cost),
Age = MIN(rc.Age)
FROM MainComponents mc
INNER JOIN RevisedComponents rc
ON rc.ComponentNo = mc.ComponentNo
CROSS APPLY(
SELECT STUFF((
SELECT DISTINCT ', ' + description
FROM RevisedComponents
WHERE ComponentNo = mc.ComponentNo
FOR XML PATH('')
), 1, 2, '') AS Description
)x
GROUP BY mc.ComponentNo, x.Description
【讨论】:
谢谢菲利克斯,让我试试这个并恢复。非常感谢 嗨 Felix,假设我有 3 条记录。描述包括 - 硬件、硬件、软件。我怎样才能确保硬件只出现一次。请帮忙 只需在STUFF
中添加一个DISTINCT
。 SELECT DISTINCT ', ' + description...
@SG_ 那么请接受答案,以便解决这个问题。以上是关于在 2 个表之间使用内连接,对于 1 个特定列的多条记录,对整数列求和,使 varchar 列以逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章
SQL - 内连接 2 个表,但如果 1 个表为空,则返回所有表