如何显示所有非聚合字段值

时间:2018-04-09 08:48:53

标签: tsql group-by aggregate-functions

我可能忽视了一些简单的事情,但我没有看到它 假设我有一个参与者和分数表

[Name]   [Score]
Tom      12
Tom      14
Tom      20
Dick     14
Dick     17
Harry    23

我希望向所有参与过不止一次的人展示他们所有的分数。这意味着在这个例子中,我想显示除最后一个之外的所有记录 第一部分很简单 - 只需按名称分组并添加having count([Score])>1。但那么如何显示所有分数呢?

我尝试过不进行分组和添加count([Score]) over (partition by [Name]),但这不是一个有效的表达式来过滤。你不能(count([Score]) over (partition by [Name]))>1

所以最后我去了

SELECT * from [Table]
where [Name] in (
     SELECT [Name] from [Table]
     GROUP by [Name]
     HAVING count([Score])>1
)

这是有效的,但我想知道是否有更好的方法 (真正的查询更长,涉及更多连接表,所有必须在内部选择内重复,所以这感觉......很脏。违反DRY原则。)
这是我能做的最好的事情吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

是的,还有其他方法可以使用exists代替in

select * 
from table t
where exists (
    select 1 from table 
    where name = t.name
    group by name
    having count(1) > 1
)

答案 1 :(得分:0)

你钉了很多。无法计算子查询中的重复名称,然后使用其结果过滤原始表。您可以使用INEXISTS,虽然它们略有不同(使用IN时,如果至少有一个结果为NULL,那么它将永远不会匹配!)。我宁愿改用EXIST

SELECT 
    T1.* 
from 
    [Table] T1
where
    EXISTS (
        SELECT
            'the name appears at least twice with not null score'
        FROM
            [table] T2
        WHERE
            T1.name = T2.name -- NULL names won't match here!
        GROUP BY
            T2.name
        HAVING
            COUNT(score) > 1)