【问题标题】:How can I add a column to a set of grouped columns?如何将一列添加到一组分组列中?
【发布时间】:2011-12-22 16:33:30
【问题描述】:

假设我有这个查询:

SELECT col1, col2, col3
FROM tab1
GROUP BY col1, col2, col3
HAVING COUNT(*) > 1    -- **************EDIT****************

我希望这组列是唯一的。但是,现在我想添加col4,可以复制,所以添加并分组是行不通的。

在 SQL Server 2008 R2 中有没有比这更好的方法?

SELECT a.col1, a.col2, a.col3, b.col4
FROM (
    SELECT col1, col2, col3
    FROM tab1
    GROUP BY col1, col2, col3
    HAVING COUNT(*) > 1 -- **************EDIT****************
    ) a JOIN tab1 b 
ON a.col1 = b.col1
AND a.col2 = b.col2
AND a.col3 = b.col3

编辑:对不起,这就是我要找的。你对我最初发布的查询是正确的,一个简单的 SELECT 就可以了。当存在重复项时,我需要为col1, col2, col3 的每个不同组显示col4 的所有值。

谢谢。

【问题讨论】:

    标签: sql sql-server-2008 group-by


    【解决方案1】:

    这在技术上与您的要求不同,但它可能满足您的要求。

    如果您选择所有四列,按所有四列分组,然后选择 COUNT(*),则计数仅表示第四列对于其他三列的每个子集出现的次数。

    SELECT col1, col2, col3, col4, COUNT(*) AS c
    FROM tab1
    GROUP BY col1, col2, col3, col4
    

    例如,如果您的结果是 ['JIM', 'JOE', 'BOB', 'BILLY', 5],这意味着拖车公园中的每个 Jim Joe Bob 都有 5 个 Billies。

    编辑:

    按照我上一条评论试试这个。

    SELECT col1, col2, col3, col4
    FROM tab1
    

    【讨论】:

    • “但是,现在我想添加col4,可以复制,所以添加和分组是不行的。” 不能包含col4 组中的 OP 特别要求查看所有 col4 值的详细信息
    • 是的,我读到“重复”这个词的意思是“重复的”,而不是“唯一的”。我的坏...
    • 问题是我需要在 col1、col2、col3 上插入具有唯一索引的表中。这就是为什么我需要那些唯一的,但 col4 可以有任何值(0+)
    • 所以听起来您只想选择这 4 列而不进行任何分组。
    • 嗯,我认为你是对的,事实上。但是在我拥有的“真实”查询中,仅使用 SELECT 与我发布的第一个查询并没有得到相同的结果。可能是因为嵌套视图...让我检查一下。
    【解决方案2】:

    我觉得你的做法还可以。但是您也可以在派生表中尝试SELECT DISTINCT col1, col2, col3 FROM tab1 而不是SELECT col1, col2, col3 FROM tab1 GROUP BY col1, col2, col3。我不确定它是否对执行计划有任何影响。

    另外,我可能会误解您想要实现的目标,但您的查询结果似乎与 SELECT a.col1, a.col2, a.col3, a.col4 FROM table1 a 相同

    【讨论】:

    • 我可能遗漏了一些东西,但不只是 SELECT a.col1, a.col2, a.col3, b.col4 FROM table1 返回相同吗?
    • 好吧,现在我认为你是对的,事实上。但是在我拥有的“真实”查询中,仅使用 SELECT 与我发布的第一个查询并没有得到相同的结果。可能是因为嵌套视图...让我检查一下。
    • @olmed0:我认为您需要发布实际查询(或更好地说明问题的内容)。
    • 就像我说的,有几个嵌套视图,很长......我无法发布实际查询,但我会尝试看看它有什么问题并告诉你。
    • 你是对的,+1。但我正在寻找不同的东西(检查编辑),我的错误。
    【解决方案3】:

    您可以使用 CTE,但您的方法没有任何问题:

    WITH G AS (
      SELECT col1, col2, col3
      FROM tab1
      GROUP BY col1, col2, col3
    )
    SELECT G.col1, G.col2, G.col3, b.col4
    FROM G JOIN tab1 b 
             ON G.col1 = b.col1
            AND G.col2 = b.col2
            AND G.col3 = b.col3;
    

    【讨论】:

    • 执行计划成本相同 :(
    • @olmed0 是的,我认为您不会真正解决这个问题。问题涉及定义组,然后引用组以获取其详细信息。如果您的组具有唯一 ID,则可以降低复杂性,但逻辑保持不变。
    • 好的,谢谢。我只是想知道我是否错过了一些可以在这里解决问题的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多