SQL中的垂直分组

SQL中的垂直分组,sql,sql-server,Sql,Sql Server,我有一个包含以下3列的表。我想在“AlphaCode”匹配且“Group1”中的所有值在“Group2”中都具有相同值的地方划出结果。例如,对于下表,应划分1121TA和1161TA的分组,并在输出中获得2807AHQ 输出应如下所示: 我相信你所说的“刻出来”是指,你想要的是那些第一组不重复的记录。 考虑到这一点,您可能希望: 编辑:在所有评论之后,我有点放弃了,但这是我最后一次尝试: 如果仔细观察,垂直组中有一个与Group1和Group2匹配的组 select * from t1

我有一个包含以下3列的表。我想在“AlphaCode”匹配且“Group1”中的所有值在“Group2”中都具有相同值的地方划出结果。例如,对于下表,应划分1121TA和1161TA的分组,并在输出中获得2807AHQ

输出应如下所示:


我相信你所说的“刻出来”是指,你想要的是那些第一组不重复的记录。 考虑到这一点,您可能希望: 编辑:在所有评论之后,我有点放弃了,但这是我最后一次尝试:

如果仔细观察,垂直组中有一个与Group1和Group2匹配的组

select * from t1 
      where Group1 in 
            (select Group1 from t1 
                    group by Group1 HAVING COUNT(Group1) <= 1)
      and Group2 in 
            (select Group2 from t1 
                    group by Group2 HAVING COUNT(Group2) <= 1);
选择Group1/Group2唯一的所有行

您可以根据需要将组1更改为组2

select * from t1 group by Group1 HAVING COUNT(Group1) <= 1;
如果你想要字母代码匹配,你需要问一下你真正想要的是什么,因为那是一个字母代码=某物的地方

我制作了一把小提琴,让你更容易复制你想要的东西。请随意使用它来完成您的文章


如果我理解你的问题,这里有一个可能的解决方案:

USE tempdb
GO
CREATE TABLE t
(
    AlphaCode varchar(50) NOT NULL,
    Group1 int NOT NULL,
    Group2 int NOT NULL
)
GO
INSERT INTO t VALUES
('1121TA', 342, 50285),
('1121TA', 340, 50285),
('1121TA', 341, 50285),
('1121TA', 341, 50345),
('1121TA', 342, 50345),
('1121TA', 340, 50345),
('1161TA', 355, 50347),
('1161TA', 354, 50347),
('1161TA', 354, 50458),
('1161TA', 355, 50458),
('2807AHQ', 77933, 50427),
('2807AHQ', 69939, 51897)
GO


WITH B AS
(
    SELECT 
        t.AlphaCode, t.Group1, t.Group2,
        COUNT(*) OVER (PARTITION BY t.AlphaCode, t.Group2) AS GroupCount
    FROM t
)
SELECT B.AlphaCode, B.Group1, B.Group2
FROM B
WHERE B.GroupCount = 1

GO
另一个甚至可以在SQL Server 6.5上运行的解决方案:

SELECT t.AlphaCode, t.Group1, t.Group2
FROM
    t INNER JOIN
    (
        SELECT 
            t.AlphaCode, t.Group2, COUNT(*) AS GroupCount
        FROM 
            t
        GROUP BY
            t.AlphaCode, t.Group2
    ) gc ON t.AlphaCode = gc.AlphaCode AND t.Group2 = gc.Group2
WHERE
    gc.GroupCount = 1

预期输出是什么?预期输出是第11、12行,因为group1中的链接在group2中不存在。例如,对于第一组字母代码1121TA 340,341和342在第2组中有相同的值,所以应该将其切掉。我一直在读这篇文章,认为我理解你想要什么,但我还是不太确定。您可能想在这里查看一些关于如何改进此问题的极好建议。因此,您寻求的最终结果是:2807AHQ的两行,因为所有其他行都没有重复的组?是的,@abr我试图仅在字母代码匹配时获得输出,但组1的值在组2中没有相同的值。您的第一个答案没有语法意义,这个并不能解决OP的问题,实际上它没有逻辑意义,因为它会给你所有的记录。首先,我能告诉你OP的要求是一个分组。第二,他不清楚应该显示什么输出,你试着帮他怎么样?如果op问题不清楚,那么用评论让他说得更清楚。@SamitaPradhan在你的帖子里贴了一个提琴,我的提琴是你截图的一个表示,查询是有效的。另外,当您显示的记录中没有一条记录出现这种情况时,说“Group1值不能在Group2中”也没有多大意义。这将是一个简单的例子,其中Group1不在group2中,从中选择不同的group2table@SamitaPradhan检查更新的答案。我把group1和group2分别放在其列中唯一和唯一的位置
SELECT t.AlphaCode, t.Group1, t.Group2
FROM
    t INNER JOIN
    (
        SELECT 
            t.AlphaCode, t.Group2, COUNT(*) AS GroupCount
        FROM 
            t
        GROUP BY
            t.AlphaCode, t.Group2
    ) gc ON t.AlphaCode = gc.AlphaCode AND t.Group2 = gc.Group2
WHERE
    gc.GroupCount = 1