首页 > 解决方案 > 识别组在多列 SQL 中具有相同的值

问题描述

我试图弄清楚如何编写一个 SQL 查询,该查询将识别表中的一个组,该组在多列的组中的记录中包含相同的值。

例如,给定以下示例表:

姓名 开始 结束 朱莉

在这种情况下,我希望确定所有试验都具有相同起点和终点的名称。根据数据,只有 James 和 Frank 符合此标准。我不希望过滤和获取只给我所有组“是”或“否”的查询输出。我确实希望查询输出带有适当标记的组的整个表。如何解决这个问题?

以下是我所得到的。我确实看到,当我分组时,在感兴趣的列中显示所有相同值的组确实会合并为一组。但是,如果我加入一个新组,其中有多个行(试验),其中每个试验可能具有相同的起点和终点,但该组的不同试验不是相同的点,那么实际上该组甚至应该产生“否”如果每个单独的试验显示相同的起点和终点。

CREATE TABLE Trial
(Name nvarchar(100),
Trial nvarchar(10),
Start nvarchar(100),
[End] nvarchar(100))

INSERT INTO Trial

VALUES
('Julie', 'A', 'Ranch St', 'Ranch St'),
('Julie', 'B', 'Ranch St', 'North Blvd'),
('James', 'A', 'Deer Rd', 'Deer Rd'),
('James', 'B', 'Deer Rd', 'Deer Rd'),
('Emily', 'A', 'Oak St', 'Oak St'),
('Emily', 'B', 'Oak St', 'Elm Rd'),
('Frank', 'A', 'Main Ave', 'Main Ave'),
('Frank', 'B', 'Main Ave', 'Main Ave'),
('Frank', 'C', 'Main Ave', 'Main Ave'),
('Jeff', 'A', 'Main Ave', 'Main Ave'),
('Jeff', 'B', 'Oak St', 'Oak St')

SELECT
    a.[Name]
    ,CASE
    WHEN a.[Start] = a.[END] THEN 'Yes' ELSE 'No'
    END AS 'TrialChk'

FROM Trial AS a

GROUP BY a.[Name]
        ,a.[Start]
        ,a.[End]

ORDER BY Name ASC;

我在上面的示例表中没有 Jeff 试验,但 Jeff 会为每次试验给出“是”,但由于所有点都不相同,因此组的输出应该是“否”。

标签: sqlsql-servergroup-byhaving

解决方案


您可以尝试Row_Number()如下所示的窗口化功能:

Create table MyTable (Name varchar(50),
Trial Char(1),
Start Varchar(20),
[End] Varchar(20))

Insert into MyTable Values
('Julie', 'A', 'Ranch St', 'Ranch St'),
('Julie', 'B', 'Ranch St', 'North Blvd'),
('James', 'A', 'Deer Rd', 'Deer Rd'),
('James', 'B', 'Deer Rd', 'Deer Rd')

;with cte as (Select name
,trial
,start
,[End]
,Row_number() Over(Partition By [Start], [End] order by [Start], [End]) as SrNo
From MyTable
)
Select 
   name, trial, start, [End], 'Yes' as [Expected Output] 
from cte where name in ( Select name from cte where SrNo > 1)
union all
Select 
   name, trial, start, [End], 'No' as [Expected Output] 
from cte where name not in (Select name from cte where SrNo > 1)
order by name

现场演示


推荐阅读