查找2列之间的差异

时间:2019-12-23 15:46:18

标签: sql-server tsql

我不确定该问题的标题是什么,但是如果您有更好的主意,可以随时对其进行编辑。

假设我有如下数据:

Column A                         Column B
John, Sally, Cindy               John, Sally, Cindy, Steve
John, Cindy                      John, Sally, Cindy
Sally, Cindy                     Sally, Cindy
Sally, Steve                     John, Sally, Steve

我想做的就是找到差异。我想查看column B中存在的内容,而不是column A中存在的内容,因此我有一个看起来像这样的列:

Column C
Steve
Sally
''
John

有什么建议可以解决吗?

编辑#1:

表不是这样存储的,该表每个单元格没有多个值;但是,我正在从SQL查询中发送报告,其任务是显示与columns a and b的区别,其中column C具有多个这样的值。

这是到目前为止,我的SQL查询当前在结果中的样子。

编辑#2:

表中每个记录/列的交集没有多个值。为了使最终用户更容易查看报告,我在SQL查询结果的交集中放置了多个值,因此请显示其中有什么。

我正尝试创建Column A来显示差异。

编辑#3:

Column B来自一个数据源 Cell来自另一个数据源。

A和B并不是彼此的子集,我只是采用两列,并试图以一种更简单的方式找到差异。

2 个答案:

答案 0 :(得分:2)

不清楚是否要将多个差异汇总到一个定界的单元格中。

示例

Declare @YourTable table (ColA varchar(150),ColB varchar(150))
Insert Into @YourTable values 
('John, Sally, Cindy','John, Sally, Cindy, Steve'),
('John, Cindy','John, Sally, Cindy'),
('Sally, Cindy','Sally, Cindy'),
('Sally, Steve','John, Sally, Steve')

Select A.*
      ,B.*
 From  @YourTable A
 Outer Apply (
                Select Diff=value
                 From (
                        Select value=ltrim(rtrim(value)) From string_split(ColA,',')
                        Union All
                        Select value=ltrim(rtrim(value)) From string_split(ColB,',')
                      ) B1
                  Group By Value
                  Having count(*)=1
             ) B

返回

ColA                ColB                        Diff
John, Sally, Cindy  John, Sally, Cindy, Steve   Steve
John, Cindy         John, Sally, Cindy          Sally
Sally, Cindy        Sally, Cindy    
Sally, Steve        John, Sally, Steve          John

答案 1 :(得分:1)

另一种方法是使用功能

create function dbo.getdiff(@colA varchar(100), @colB varchar(100))
returns varchar(100)
as
begin
    return (select stuff((select ',' + value from(
    select trim(value) value FROM string_split(@colB, ',')
    EXCEPT SELECT trim(value) FROM string_split(@colA, ',')) x  for xml path('')),1,1,''))
end

并获得理想的结果

select cola, colb, dbo.getdiff(cola, colb) diff from summarytable