2016-07-07 2 views
1

Ich stieß auf ein Problem bei der Konvertierung von Sybase nach Netezza. Im Beispiel wird das SELECT vereinfacht.Netezza GROUP BY Sub-Spalte Konvertierung von Sybase

Während dieser Sybase ausgewählter Werke:

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 

Das gleiche Konzept auf Netezza wird sagen, dass date_col in GROUP BY oder in aggragate Funktion sein muss. Trotz der Tatsache, dass die Spalten id_date und id_date2 bereits gruppiert sind.

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

Die meisten RDMBS (MySQL ist eine bemerkenswerte Ausnahme) würde auch bei Ihrer Abfrage Fehler aus. Der Grund dafür ist, dass die Datenbank _which_ record nicht kennt, um einen Wert für "date_col" für jede Gruppe zu erhalten. Wirklich, nur du weißt das. Wenn Sie artikulieren können, welche Logik Sie verwenden könnten, um einen "date_col" -Wert für jede Gruppe zu wählen, kann Ihnen jemand helfen, die Abfrage umzuformen. –

+1

Gemäß dem ANSI-SQL-Standard dürfen Sie keine Spaltenaliasnamen in die GROUP BY-Klausel aufnehmen, sondern nur Spalten. – jarlh

+0

Danke Jungs, Sybase scheint alle Arten von Regeln zu vermeiden – hidross

Antwort

2

Ich denke, das ist das, was Sie wollen. Mach das to_char Zeug in einer abgeleiteten Tabelle. Haben GROUP BY auf ihr Ergebnis:

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

Vielen Dank. Das scheint gut zu funktionieren. Sybase scheint viele Dinge zu erlauben, die normalerweise nicht erlaubt sind. – hidross

0

Sybase ASE bekannt ist, eine bestimmte nicht-ANSI semantischen w.r.t. zu ermöglichen GROUP BY, wobei Ausdrücke, die nicht in der GROUP BY-Klausel enthalten sind, in der SELECT-Liste nicht aggregiert sind. Der Nettoeffekt ist, dass Sie viele Ergebniszeilen erhalten, die Sie nicht erwartet haben. Diese Funktion ist vollständig in den ASE-Handbüchern dokumentiert: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc32300.1600/doc/html/san1390612146654.html

Denken Sie daran, dass diese Syntax 1986 erfunden wurde, lange bevor es so etwas wie einen ANSI-Standard gab.