首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server:显示两行之间在列中的差异

SQL Server:显示两行之间在列中的差异
EN

Stack Overflow用户
提问于 2012-01-20 07:27:59
回答 1查看 1.5K关注 0票数 4

我有一个非常大的表(200+列),有1000行。我需要在列中显示2行之间的差异。我可以将所需的2行加载到临时表中,但我不确定如何从那里继续。

例如(我在这里只使用5行,并且只使用通用名称)

代码语言:javascript
复制
ID        | GName       | SName    | Add1         | Add2
360111    | Billy       | Bob      | 1 Happy St   | Sydney
360111    | Billy       | Bob      | 6 Sunny St   | Melbourne

我想要展示的是

代码语言:javascript
复制
Add1       | Add2
1 Happy St | Sydney
6 Sunny St | Melbourne

因为这是两行之间唯一的区别。其他时候不会有区别,或者很多时候。

干杯

EN

回答 1

Stack Overflow用户

发布于 2012-01-24 20:06:00

您将需要创建一些动态sql,它将循环遍历临时表的元数据,并检查是否需要返回给定列。最后,动态地创建一个SELECT语句,该语句将返回键(您可以针对这种情况对其进行硬编码,或者如果您将此逻辑放入更通用的存储过程中,也可以将其作为参数)。

快速和脏,它看起来像这样:

代码语言:javascript
复制
-- setting up test-data
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test

SELECT ID     = 360111,
       GName  = 'Billy',         
       SName  = 'Bob',       
       Add1   = '1 Happy St',   
       Add2   = 'Sydney'
 INTO #test

UNION ALL 

SELECT ID     = 360111,
       GName  = 'Billy',     
       SName  = 'Bob',      
       Add1   = '6 Sunny St',   
       Add2   = 'Melbourne'


GO
-- find different columns and list them
DECLARE @c_column_name sysname
DECLARE @sql nvarchar(max)

IF OBJECT_ID('tempdb..#diff_columns') IS NOT NULL DROP TABLE #diff_columns

SELECT column_name = name
  INTO #diff_columns 
  FROM sys.columns
 WHERE 1 = 2

DECLARE column_loop CURSOR LOCAL FAST_FORWARD
    FOR SELECT diff_columns = name
          FROM tempdb.sys.columns
         WHERE object_id = object_id('tempdb..#test')
           AND name <> 'ID' -- no need to test the key-field
OPEN column_loop
FETCH NEXT FROM column_loop INTO @c_column_name
WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @sql = 'INSERT #diff_columns (column_name)
                       SELECT ''' + @c_column_name + '''
                        WHERE EXISTS ( SELECT * FROM #test HAVING COUNT (DISTINCT ' + @c_column_name + ') > 1)'

        EXEC (@sql)                        

        FETCH NEXT FROM column_loop INTO @c_column_name
    END
CLOSE column_loop 
DEALLOCATE column_loop 

SELECT @sql = 'SELECT ID'
SELECT @sql = @sql + ', ' + column_name
  FROM #diff_columns
SELECT @sql = @sql + ' FROM #test'

EXEC (@sql)   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8934898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档