2016-07-07 56 views
1

从Sybase转换到Netezza时遇到问题。在例子中,ill简化了SELECT。从Sybase转换Netezza GROUP BY子列

虽然这种选择的Sybase作品:

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或aggragate功能。尽管列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 
+1

大多数RDMBS(MySQL是一个值得注意的例外)也会在您的查询中出错。其根本原因是数据库不知道每个组选择哪个_which_记录来获取'date_col'的值。真的,只有你知道这一点。如果您可以阐明您可能使用哪种逻辑为每个组选择一个“date_col”值,则有人可以帮助您重构查询。 –

+1

根据ANSI SQL标准,您不允许在GROUP BY子句中仅放置列别名。 – jarlh

+0

谢谢你们,Sybase似乎避免了各种规则 – hidross

回答

2

我想这是你想要的。在派生表中执行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 
+0

非常感谢。这似乎工作得很好。 Sybase似乎允许许多通常不被允许的事情。 – hidross