根据查询的不相同结果选择SQL行

时间:2017-09-22 14:02:22

标签: sql sql-server

我试图在不事先知道哪些

的情况下选择相关的列

我做了:

select *
from table
where id = '1'

我得到的结果可能是10行和100多列

|id | column1 | column2  | column3 | column4 | column5 |....
| 1 |    a    |     b    |    c    |    d    |    e    |....
| 1 |    a    |    XXX   |    c    |    d    |    e    |....
| 1 |    a    |     b    |    c    |   YYY   |    e    |....
| 1 |    a    |     b    |    c    |    d    |    e    |....

对于每一行,一列(或多列)值不同,但我不知道哪一行

有什么办法可以用第一个查询创建一个临时表,并执行一个子查询,只显示一列在所有行中没有相同值的列?

所以结果如下:

|id | column2  | column4 |
| 1 |     b    |    d    |
| 1 |    XXX   |    d    |
| 1 |     b    |   YYY   |
| 1 |     b    |    d    |

因为第2列和第4列是具有不相同数据的那些,所以我想看到它们。

3 个答案:

答案 0 :(得分:1)

如前所述,这需要动态sql。 也许这会对你有所帮助:

CREATE TABLE Column_Relevance
SELECT id, 
       COUNT(DISTINCT(column_1))/COUNT(*) AS relevance_column_1,
       COUNT(DISTINCT(column_2))/COUNT(*) AS relevance_column_2,
       COUNT(DISTINCT(column_3))/COUNT(*) AS relevance_column_3,
#      AND SO ON....
GROUP BY id;

所有related_columns值为< 1表示列的不同值。您可以在几分钟内在excel中构建整个语句。 创建表后,添加另一列并根据列相关性创建一个select语句(例如,选择if(relevant_column_1< 1,column_1,else' ignore')作为column_1。这将返回字符串&# 39;忽略'对于所有列,不具有不同的值。 这远非完美,但也许它可以帮到你一点点。

答案 1 :(得分:0)

这是一种可以使用某些聚合来帮助的方法。你说你有近100列,所以这可能需要一些努力来创建,但一旦完成它就没关系了。这只是为了分析。你可以利用sys.columns为你构建代码,但我们又回到了动态sql的土地上。

declare @Something table
(
    ID int
    , Column1 varchar(10)
    , Column2 varchar(10)
    , Column3 varchar(10)
    , Column4 varchar(10)
    , Column5 varchar(10)
)

insert @Something
values
(1, 'a', 'b', 'c', ' d ', 'e')
, (1, 'a', 'XXX', 'c', ' d ', 'e')
, (1, 'a', 'b', 'c', 'YYY', 'e')
, (1, 'a', 'b', 'c', ' d ', 'e')
;

with MinMax as
(
    select ID
        , MIN(Column1) as Col1Min
        , MAX(Column1) as Col1Max
        , MIN(Column2) as Col2Min
        , MAX(Column2) as Col2Max
        , MIN(Column3) as Col3Min
        , MAX(Column3) as Col3Max
        , MIN(Column4) as Col4Min
        , MAX(Column4) as Col4Max
        , MIN(Column5) as Col5Min
        , MAX(Column5) as Col5Max
    from @Something
    group by ID
)

select s.ID 
    , Column1 = case when mm.Col1Max = mm.Col1Min then '' else s.Column1 end
    , Column2 = case when mm.Col2Max = mm.Col2Min then '' else s.Column2 end
    , Column3 = case when mm.Col3Max = mm.Col3Min then '' else s.Column3 end
    , Column4 = case when mm.Col4Max = mm.Col4Min then '' else s.Column4 end
    , Column5 = case when mm.Col5Max = mm.Col5Min then '' else s.Column5 end
from @Something s
join MinMax mm on mm.ID = s.ID

答案 2 :(得分:-1)

你尝试过使用distinct吗?它只返回唯一的行:

选择* 从表 其中id ='1'

|id | column2  | column4 |
| 1 |     a    |    a   |
| 1 |     a    |    a   |
| 1 |     b    |    d   |
| 1 |     b    |    d   |

从表中选择distinct *,其中id ='1'

|id | column2  | column4 |
| 1 |     a    |    a   |
| 1 |     b    |    d   |

我希望这会对你有所帮助。