从 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_date 和 id_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 标准之类的东西。
我在从 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_date 和 id_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 标准之类的东西。