2012-11-21 27 views
3

我必须找到两个变量组合的不同计数。我用下面的2个查询找到计数:GROUP BY和catx给出2列的计数,给出不同的输出

select count(*) from 
( select V1, V2 
    from table1 
    group by 1,2 
) a 

select count(distinct catx('-', V1, V2)) 
from table1 

从逻辑上讲,上述两种查询应给予同样的计数,但我得到不同的计数。需要注意的是

  • V1和V2是整数
  • 两个变量可以有NULL值,但也有我的表没有空值
  • 没有负值

知道为什么我可能会得到不同的输出?哪种方法可以找到2列或更多列的不同组合的最佳方法?

谢谢。

+0

'count(distinct cat(V1,' - ',V2))'query? – raina77ow

+0

哪个版本的SQL(MySQL,SQLite,Oracle等)是这样的? –

+0

@MarkBannister我不太确定。我在SAS环境中工作,我认为这是MySQL的变体。但是逻辑不应该随着SQL的版本而变化,对吧? – Macbook

回答

7

当您运行第一个sql代码时,SAS日志会给出答案。使用'group by'需要汇总功能,否则将被忽略。计数将因此返回整个行数,而不是两个变量组合的不同计数。 只需将计数(*)添加到子查询中,您将得到两种方法的相同答案。

select count(*) from 
( select V1, V2, count(*) 
    from table1 
    group by 1,2 
) a 
0

似乎GROUP BY在SAS中不能这样工作。除非在查询中有聚合函数,否则不能使用它删除重复项。我发现这个日志我的查询输出的 -

注意:GROUP BY子句已被丢弃,因为无论是SELECT子句 引用也不汇总函数相关的 表表达式的可选的HAVING子句。

这回答了这个问题。

1

在子查询中对第一个查询使用distinct .. 当您执行group by但不包含任何聚合函数时,它将丢弃group by。 所以你仍然会有v1和v2的重复组合。

-1

你也可以忽略这个组,也只是在子查询中添加一个独特的。另外你写的第二个查询效率更高