我想获取第一列和第二列中的记录,但仅限于第 3 列中具有相同值 (
LIKE %ABGS%
) 的记录。
我们在 Col1 中有一组 ID,这些 Id 在第 2 列中可以有 1...N 个条目,并且对于第 1 列和第 2 列组合中的每个条目,第 3 列中有不同的值。所以这些组是 Col 1 和 Col 2 和第 3 栏中的不同值。
因此,我只想得到 Col1 和 Col2 的结果,它们在
Col 3 (LIKE %ABGS%)
中具有相同的值。如果 Col1 和 Col2 组下的其中一个条目不具有此状态,则必须将其从结果中排除!
在下表中,您有望了解我的请求范围
表:
第 1 栏 | 第 2 栏 | 第 3 栏 |
---|---|---|
PSPID_1 | POSID_10 | FREI ABGS EROF |
PSPID_1 | POSID_11 | ABGS 埃罗夫 |
PSPID_1 | POSID_12 | FREI ABGS |
PSPID_2 | PSPID_20 | FREI ABGS |
PSPID_2 | PSPID_21 | EROF |
PSPID_3 | POSID_30 | ABGS 埃罗夫 |
PSPID_3 | POSID_31 | ABGS 埃罗夫 |
PSPID_3 | POSID_32 | FREI ABGS EROF |
PSPID_3 | POSID_33 | FREI ABGS |
结果应该是:
第 1 栏 | 第 2 栏 |
---|---|
PSPID_1 | POSID_10 |
PSPID_1 | POSID_11 |
PSPID_1 | POSID_12 |
PSPID_3 | POSID_30 |
PSPID_3 | POSID_31 |
PSPID_3 | POSID_32 |
PSPID_3 | POSID_33 |
第 2 列中的 POSID_10、POSID_11、POSID_12 位于第 1 列中的 PSPID_1 下,并且第 3 列中的所有值都具有 LIKE %ABGS% --> 包含在结果中
第 2 列中的 POSID_20、POSID_21 位于第 1 列中的 PSPID_2 下,并且并非第 3 列中的所有值都具有 LIKE %ABGS% --> 从结果中排除
第 2 列中的 POSID_30、POSID_31、POSID_32、POSID_33 位于第 1 列中的 PSPID_3 下,并且第 3 列中的所有值都具有 LIKE %ABGS% --> 包含在结果中
数据的聚类如下:
PSPID_1 |
- POSID_10 |
- POSID_11 |
- POSID_12 |
PSPID_2 |
- POSID_20 |
- POSID_21 |
PSPID_3 |
- POSID_30 |
- POSID_31 |
- POSID_32 |
- POSID_33 |
PSPID_4 |
- POSID_40 |
- POSID_41 |
等等......
一种方法是使用窗口
COUNT
获取组中的行数以及符合条件的行数,然后在这些值相同(且大于 1)时进行过滤。结果如下:
DECLARE @SearchValue varchar(4) = 'ABGS';
WITH CTE AS(
SELECT YT.Column1,
YT.Column2,
YT.Column3,
COUNT(*) OVER (PARTITION BY YT.Column1) AS TotalRows,
COUNT(CASE WHEN YT.Column3 LIKE '%' + @SearchValue + '%' THEN 1 END) OVER (PARTITION BY YT.Column1) AS SearchRows
FROM dbo.YourTable YT)
SELECT CTE.Column1,
CTE.Column2
FROM CTE
WHERE CTE.TotalRows = CTE.SearchRows
AND CTE.SearchRows > 0;