Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Informix:GROUPBY子句语法错误_Sql_Select_Group By_Informix - Fatal编程技术网

Sql Informix:GROUPBY子句语法错误

Sql Informix:GROUPBY子句语法错误,sql,select,group-by,informix,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

我有一个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”(如下所示)时,它在GROUPBY子句中表示语法错误

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";
然后我修改了GROUPBY子句,用数字表示列,它就可以执行了

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";
目前我不明白为什么GROUPBY条款存在问题

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";
更新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进行了更改。原来是空白的。所以,我把它改成了真的。重新启动了。我无法登录到我们的应用程序。SQLExceptions由WAS引发,但无法查看堆栈跟踪,因为WAS截断了最后几行。将属性改回空白后,我可以登录到我们的应用程序。

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

这就是为什么
“CLASS”
符号不起作用的原因

剩下的问题似乎是表
itemmst
中没有名为
class
的列。如果您可以证明它在那里(通过显示
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)上对IDS11.70.FC2运行该命令时,我没有得到任何错误(也没有数据,但随后我没有在任何一个表中插入任何数据)


您使用哪种语言将此SQL获取到数据库?

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

这就是为什么
“CLASS”
符号不起作用的原因

剩下的问题似乎是表
itemmst
中没有名为
class
的列。如果您可以证明它在那里(通过显示
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)上对IDS11.70.FC2运行该命令时,我没有得到任何错误(也没有数据,但随后我没有在任何一个表中插入任何数据)



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

请提供SLSDate和ITEMST表(相关部分)的架构。刚刚用schemaThanks表更新了我的问题,以获取架构信息。您不能透露服务器版本或平台信息吗?服务器是AIX 7,Informix版本是11请注意我的回答中的注释:您需要标识您正在使用的Informix版本(从最后一个小数点后的最后一位开始,如果您使用的是11.50.UC9W1X1)。请提供SLSDate和ITEMST表的(相关部分)架构。刚刚用schemaThanks表更新了我的问题,以获取架构信息。您不能透露服务器版本或平台信息吗?服务器是AIX 7,Informix版本是11请注意我的回答中的注释:您需要标识您正在使用的Informix版本(从最后一个小数点后的最后一位开始,如果您使用的是11.50.UC9W1X1).我们使用的是运行在WEPShere中的Java。我正在尝试设置DELIMIDENT变量,但不确定在哪里设置它。我也不知道;我会拼写JDBC:它是E、s、Q、L、斜杠和C,不是吗?我可以运行Java编译器…哦,不;这是一个C编译器。它可能是一个连接属性;在建立JDBC连接时,可能需要在客户端环境中设置它。JDBC文档中可能有一些关于如何设置它的内容。请注意@JonathanLeffler的答案在DB服务器的操作系统中设置DELIMIDENT env变量时有效。尝试此操作时,我们能够毫无问题地进行查询。但当从应用服务器(WAS)执行查询时,问题仍然存在。设置WAS的datasource属性“ifxDelimident”,我们无法登录到应用程序,因为我们发现当this属性设置为true时,它在Informix(或JDBC驱动程序)中启用了区分大小写。我们在Informix中定义的表名和列名是小写的。和SQL st