Count on DISTINCT的几个字段只在MySQL上工作



我需要一个查询,没有任何变化的工作在这三个不同的数据库服务器:MySQL, MSSQL, PostgreSQL。在这个查询中,我必须计算一个列与以下表达式在MySQL上正确工作:

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum

不同的字段是不同的类型:

field_char = character
field_int  = integer
field_date = datetime

表达式在父查询选择中,所以如果我试图用子查询方法实现结果,我会在这种情况下绊倒:

SELECT t0.description,t0.depnum
(select count(*) from (
  select distinct f1, f2, f3 from salestable t1
  where t1.depnum = t0.depnum
) a) AS numitems
FROM salestable t0

我得到一个错误与此查询,我怎么能得到父查询的值?

表达式在MySQL上正确工作,但当我尝试在Sql Server或PostgreSQL上执行它时,我得到一个错误(问题是计数函数不接受MSSQL/PostgreSQL上不同类型的3个参数),是否有一种方法可以在每个数据库服务器(Sql Server, MySQL, PostgreSQL)中工作的表达式实现相同的结果?

在任何平台上执行此操作的一般方法如下:

select count(*) from (
  select distinct f1, f2, f3 from table
) a

Edit for new info:

如果您尝试连接到不同的列表(包括深度),然后进行计数怎么办?我创建了一些测试数据,这似乎是有效的。确保COUNT位于t1列之一上,否则当t1中没有相应的条目时,它会错误地返回1而不是0。

SELECT t0.description, t0.depnum, count(t1.depnum) as 'numitems'
FROM salestable t0
LEFT JOIN (select distinct f1,f2,f3,depnum from salestable) t1
  ON t0.depnum = t1.depnum
GROUP BY
  t0.description, t0.depnum

如何连接?

COUNT(DISTINCT field_char || '.' || 
               cast(field_int as varchar) || '.' || 
               cast(field_date as varchar)) AS costumernum

警告:您的连接操作符可能因RDBMS类型而异。

显然,连接操作符的可移植性本身就是一个问题:

  • Oracle, Postgres和SQL Server的字符串连接操作符

我试着帮你解决distinct问题。

最新更新