如何将列添加到一组分组列?

时间:2011-12-22 16:33:30

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

假设我有这个问题:

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就可以了。我需要的是,当存在重复项时,为col4的每个不同组显示col1, col2, col3的所有值。

感谢。

3 个答案:

答案 0 :(得分: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比5。

编辑:

根据我上次的评论,试试这个。

SELECT col1, col2, col3, col4
FROM tab1

答案 1 :(得分:1)

你这样做的方式对我来说似乎没问题。但您也可以在派生表中尝试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

相同

答案 2 :(得分:0)

您可以使用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;