从多个列中的多行返回结果SQL Server

时间:2018-12-14 00:12:35

标签: sql-server

我已经搜索过,但是找不到我想要达到的目标的答案。举例来说,我有此数据。

|SN    | column1   | column2  | column3 | column4 | column5 | column6 |
+------+-----------+----------+---------+---------+---------+---------+
|1     | orange    | banana   | apple   | grapes  | null    |    555  |
|2     | banana    | grapes   | null    | null    | null    |    555  |
|3     | grapes    | orange   | banana  | null    | null    |    555  |
|4     | orange    | banana   | grapes  | null    | null    |    555  |

我想要一个搜索,其中所有行在任何列中都有重复,并且column6为555。无论SN列如何,结果都将显示葡萄和香蕉。因为存在555,每行都有葡萄。请参阅下面的示例结果:


|SN | column1   | column2  | column3  | column4  | column5 | column6 |
+---+-----------+----------+----------+----------+---------+---------+
|1  | orange    |**banana**| apple    |**grapes**| null    |    555  |
|2  |**banana** |**grapes**| null     | null     | null    |    555  |
|3  |**grapes** | orange   |**banana**| null     | null    |    555  |
|4  | orange    |**banana**|**grapes**| null     | null    |    555  |

我尝试使用下面的计数和示例代码,但结果为空白。



select column1, column2, column3, column4, column5, COUNT(*)
From Sheet Group By 
column1, column2, column3, column4, column5
Having 
Count(*) > 1

输出应显示与香蕉/葡萄和555相同值的所有列

请帮助!

1 个答案:

答案 0 :(得分:0)

您可以先取消旋转数据表,然后进行分组以找到所需的值。

您需要了解一些事情才能更好地理解答案。

  1. 对数据进行UNPIVOT处理的内容。在 MSDN official documentation 上了解有关此内容。

  2. 我们如何使用CROSS APPLY取消数据处理。例如,请参见 this link

请参阅下面的查询和 live demo

; with upview as
(
select yt.sn, ytc.col, column6
from yourtable yt
cross apply
( values (column1),(column2),(column3),(column4),(column5)) ytc(col)
)
,
gettheSN as 
(
select col  
from upview
where column6=555
group by col
having count(sn)=
(select count(1) from yourtable)
)
select * from gettheSN

现在,如果您需要取消透视其他列,请在column6之后再说column7和column8,我们不会取消透视,那么您的交叉应用部分将看起来像

cross apply
( values (column1),(column2),(column3),(column4),(column5), (column7),(column8)) ytc(col)
)