在Firebird中模拟窗口函数

时间:2014-05-30 05:06:35

标签: firebird

是否有人可以帮助我查询。

这是我的桌子。

enter image description here

我运行查询时结果如下图所示。

enter image description here

TOTAL_BINS_PER_SITE字段是SITE的bin计数组的总和。这是我的查询

  SELECT
    X.SITE,
    X.STATUS,
    X.TOTAL_BINS_PER_BIN,
    (SELECT SUM(BIN_COUNT) FROM TS_BINS_PER_SITE WHERE ID = X.ID) AS TOTAL_BINS_PER_SITE
FROM
    (SELECT ID, SUM(BIN_COUNT) AS TOTAL_BINS_PER_BIN, SITE AS SITE, STATUS AS STATUS
    FROM TS_BINS_PER_SITE
    WHERE STATUS = 'P'
    AND ID = (
       SELECT A.ID
       FROM TS_REC_DATA A
       JOIN TS_MAIN_REC B
       ON A.REC_ID = B.ID
       WHERE B.LOT_ID = 'QYYZCA004K'
       AND B.TESTER_ID = 'LTXMXSPC035'
       AND A.DATEMODIFIED = '5/30/2014 10:01:05')
       GROUP BY SITE, STATUS, ID
) X

它正在运行,但问题是TOTAL_BINS_PER_SITE会将所有bin计数加起来,我期望的是它将按站点对BIN_COUNT组进行求和。例如,站点1,TOTAL_BINS_PER_SITE假设为5,因为站点1中的bin_count 4 + bin_count 1。 我知道我在第5行的查询缺失" GROUP BY SITE",但是当我将其添加到第5行时,错误说"单行中的多行选择"。有人可以帮助我离开这里吗?非常感谢你!

1 个答案:

答案 0 :(得分:1)

问题是,您在select中的子查询具有条件WHERE ID = X.ID,而您应该使用WHERE SITE = X.SITE(或者WHERE SITE = X.SITE AND ID = X.ID)来仅在总和中获取该网站的项目

在即将推出的Firebird 3中,可以使用窗口功能简化,例如使用

SUM(TOTAL_BINS_PER_BIN) OVER (GROUP BY X.SITE) AS TOTAL_BINS_PER_SITE

而不是select中的子查询。