在 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,您可以使用MINMAX。然后使用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 中添加一个DISTINCTSELECT DISTINCT ', ' + description... @SG_ 那么请接受答案,以便解决这个问题。

以上是关于在 2 个表之间使用内连接,对于 1 个特定列的多条记录,对整数列求和,使 varchar 列以逗号分隔的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 内连接 2 个表,但如果 1 个表为空,则返回所有表

mysql的多表连接

组合 3 个表,其中 2 列的组合不是唯一的

LARAVEL 如何连接 2 个不同的数据库并连接不同服务器上的 2 个表?

python数据框特定列的缩放值在1-10之间

MySQL - 数据查询语言DQL数据连接语法及实例