依靠几个字段的DISTINCT只能在MySQL上工作吗?

时间:2011-09-02 16:09:27

标签: mysql sql sql-server postgresql

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

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum

distinct中的字段有不同的类型:

field_char = character
field_int  = integer
field_date = datetime

表达式在父查询select中,所以如果我尝试用子查询方法实现结果,我偶然发现:

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上执行它时出现错误(问题是count函数不接受MSSQL / PostgreSQL上不同类型的3个参数),是否存在使用在每个数据库服务器(SQL Server,MySQL,PostgreSQL)中都有效的表达式来实现相同结果的方法吗?

2 个答案:

答案 0 :(得分:9)

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

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

修改以获取新信息:

如果您尝试加入不同的列表(包括部门)然后进行计数,该怎么办?我创建了一些测试数据,这似乎有效。确保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

答案 1 :(得分:2)

连接怎么样?

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

警告:您的连接运算符可能因RDBMS风格而异。

<强>更新

显然,串联运算符可移植性本身就是个问题:

我试图帮助您处理distinct问题。