Informix:Group By Clause语法错误

时间:2011-12-22 04:30:01

标签: sql select group-by informix

我有一个SQL,我试图在Informix中运行,但它继续提示“语法错误”或“列(...)在表格中找不到”。

我的查询如下:

SELECT      SLS.STORE, ITM.CLASS, SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM.CLASS
ORDER BY    SLS.STORE, ITM.CLASS;

当我运行上面的查询时,informix说“在查询的任何表中找不到列(类)(或SLV未定义)”。

当我将ITM.CLASS更改为ITM。“CLASS”(如下所示)时,它表示GROUP BY子句的语法错误。

SELECT      SLS.STORE, ITM."CLASS", SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM."CLASS"
                          ^ syntax error here
ORDER BY    SLS.STORE, ITM."CLASS";

然后我更改了GROUP BY子句以使用数字来表示列,并且能够执行。

SELECT      SLS.STORE, ITM."CLASS", SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    1, 2
ORDER BY    SLS.STORE, ITM."CLASS";

目前我不明白为什么GROUP BY子句存在问题。

更新1 itemmst表模式类似于下面的

create table 'informix'.itemmst (
    short_sku VARCHAR(13) not null,
    item_desc lvarchar(2000),
    item_del_cd VARCHAR(1),
    item_suppl VARCHAR(10),
    item_suppl_contract VARCHAR(10),
    div VARCHAR(3),
    dept VARCHAR(3),
    CLASS VARCHAR(6),
    ..
)

更新2 我对WAS数据源的一个自定义属性ifxDELIMIDENT进行了更改。原来它是空白的。所以,我把它改成了真的。重启WAS。我无法登录我们的应用程序。 WAS抛出了SQLExceptions,但由于WAS截断了最后几行,因此无法看到堆栈跟踪。将属性更改为空白后,我可以登录到我们的应用程序。

1 个答案:

答案 0 :(得分:1)

Informix将单引号和双引号视为字符串分隔符,除非您通过设置DELIMIDENT环境变量强制它将双引号视为标记分隔标识符。然后字符串用单引号括起来,分隔的标识符用双引号括起来。 (即使设置了DELIMIDENT,您仍然可以使用所有者名称左右单引号或双引号。)

这就是"CLASS"符号不起作用的原因。

剩余问题似乎是表class中没有名为itemmst的列。如果您可以证明它存在(通过显示itemmst表的模式),那么我们还有其他问题。您将需要确定您正在使用的Informix的版本(在最后一个小数点之后的最后一位数字 - 如果这是您拥有的版本,则为11.50.UC9W1X1),以及您运行它的平台。这应该是自动提供的信息,尽管你不是第一个,也不可能是最后一个,省略它。


对其他人的模式进行逆向工程很难。但是,有时候必须这样做!

CREATE TEMP TABLE slsdate
(
    store               VARCHAR(13) NOT NULL,
    sls_qty             DECIMAL(6,0) NOT NULL,
    sls_cost            DECIMAL(10,2) NOT NULL,
    sls_sell            DECIMAL(10,2) NOT NULL,
    short_sku           VARCHAR(13) NOT NULL,
    sales_trans_date    DATE NOT NULL
);

CREATE TEMP TABLE itemmst
(
    short_sku           VARCHAR(13) NOT NULL,
    item_desc           LVARCHAR(2000),
--    item_del_cd         VARCHAR(1),
--    item_suppl          VARCHAR(10),
--    item_suppl_contract VARCHAR(10),
--    div                 VARCHAR(3),
--    dept                VARCHAR(3),
    CLASS               VARCHAR(6)
);

SELECT      SLS.STORE, ITM.CLASS, SUM(SLS.SLS_QTY) AS SUM_SLS_QTY,
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND
            SLS.SALES_TRANS_DATE BETWEEN TO_DATE('2011-04-01', '%Y-%m-%d')
                                     AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM.CLASS
ORDER BY    SLS.STORE, ITM.CLASS;

当我在MacOS X 10.7.2(使用SQLCMD 87.02和CSDK 3.70.FC2)上对IDS 11.70.FC2运行时,我没有收到错误(也没有数据,但是我没有在任何一个表中插入任何数据)

您使用哪种语言将此SQL引入数据库?