从 Sybase 转换的 Netezza GROUP BY 子列

Netezza GROUP BY sub column converting from Sybase

我在从 Sybase 转换到 Netezza 时遇到问题。在示例中,我将简化 SELECT.

虽然此 Sybase select 有效:

SELECT  t1.col1,
CONVERT(CHAR(20), ymd(year(t1.date_col ),month(t1.date_col ),1) ,112)id_date,
CONVERT(CHAR(20), ymd(year(t1.date_col ),month(t1.date_col ),1) ,112) + 10000 id_date2,
SUM(t1.summ_col) summ_col
FROM test_table t1
GROUP BY t1.col1, id_date, id_date2

Netezza 上的相同概念会说 date_col 必须在 GROUP BY 或聚合函数中。尽管 id_dateid_date2 列已经分组。

Netezza :

SELECT  t1.col1,
TO_CHAR( ymd(year(t1.date_col ),month(t1.date_col ),1), 'YYYYMMDD') id_date,
TO_CHAR( ymd(year(t1.date_col ),month(t1.date_col ),1), 'YYYYMMDD') + 10000 id_date2,
SUM(t1.summ_col) summ_col
FROM test_table t1
GROUP BY t1.col1, id_date, id_date2

我猜这就是你想要的。在派生的 table 中做 to_char 的事情。对结果执行 GROUP BY

select col1, id_date, id_date2, SUM(summ_col) summ_col
from
(
    SELECT t1.col1,
           TO_CHAR( ymd(year(t1.date_col ),month(t1.date_col ),1), 'YYYYMMDD') id_date,
           TO_CHAR( ymd(year(t1.date_col ),month(t1.date_col ),1), 'YYYYMMDD') + 10000 id_date2,
           t1.summ_col
    FROM test_table t1
) dt
GROUP BY col1, id_date, id_date2

众所周知,Sybase ASE 允许特定的非 ANSI 语义 w.r.t。 GROUP BY,其中不在 GROUP BY 子句中的表达式允许在 SELECT 列表中进行非聚合。最终结果是您会得到很多您没有预料到的结果集行。 此功能已完整记录在 ASE 手册中:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1600/doc/html/san1390612146654.html

请记住,此语法是在 1986 年设计的,远早于 ANSI 标准之类的东西。