在Firebird 1.5中的单个SQL查询中获取不同组的计数?

时间:2009-08-19 19:45:56

标签: sql count firebird distinct

我在存储过程中遇到了以下内容:

  for
    select 1
    from   scan_queue
    where  ( date_time_locked is null       )
      and  ( scan_seqno >= :varMinScanSeqno )
      and  ( scan_seqno <= :varMaxScanSeqno )
    group by loan_id, collateral_id, insurance_id
    into   varNotUsed
  do
    varItemsToScan = varItemsToScan + 1;

我的第一个想法是,这可能是计算群组数量的低效方式,但我的第二个想法是,“嘿,你怎么会在一个查询中写出来呢?”我没有一个好的答案。 (所以这更像是一个学术问题。)我正在寻找一个连接ID的解决方案,如下所示:

select count(distinct loan_id || collateral_id || insurance_id)
from   scan_queue
where  ( date_time_locked is null       )
  and  ( scan_seqno >= :varMinScanSeqno )
  and  ( scan_seqno <= :varMaxScanSeqno )

查询此信息的最佳方式是什么?

编辑:由于我显然没有说清楚,我使用的是Firebird v1.5。

4 个答案:

答案 0 :(得分:1)

由于您使用的是Firebird 1.5,因此似乎没有一个干净的解决方案。

Firebird 2.0支持“FROM子句中的子查询”表示法,这是回答此类问题的基本要求 - 请参阅所有其他答案。

因此,如果您需要一个干净的解决方案,请升级到Firebird 2.1。否则,你所拥有的东西似乎就像你能得到的一样好。

(其他一些DBMS支持临时表;如果是Firebird 1.5,则可以将初始数据选择到临时表中,然后计算临时表中的行,然后再次删除临时表。)

答案 1 :(得分:0)

普通老count(distinct ..)有什么问题?

select count(*) from ( 
select loan_id, collateral_id, insurance_id
from   scan_queue
where  ( date_time_locked is null       )
  and  ( scan_seqno >= :varMinScanSeqno )
  and  ( scan_seqno <= :varMaxScanSeqno )
group by loan_id, collateral_id, insurance_id
)

答案 2 :(得分:-2)

不知道它是否效率更高或更低,但子查询会这样做。

select count(grouping) 
from
( select count(*) as grouping
    from   scan_queue
    where  ( date_time_locked is null       )
      and  ( scan_seqno >= :varMinScanSeqno )
      and  ( scan_seqno <= :varMaxScanSeqno )
    group by loan_id, collateral_id, insurance_id) a

答案 3 :(得分:-2)

这适用于SQL Server:

SELECT
    COUNT(*)
    FROM (SELECT
              GroupColumn
              FROM YourTable
              WHERE ...
              GROUP BY GroupColumn
         ) dt