我试图在不事先知道哪些
的情况下选择相关的列我做了:
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列是具有不相同数据的那些,所以我想看到它们。
答案 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 |
我希望这会对你有所帮助。