分区投掷“SELECT列表中的表达无效”。

时间:2013-02-25 14:11:34

标签: sql db2 ibm-midrange

在我们的数据库中,我们有一些表使用这些行的十进制日期格式:yyyymmdd,全部为一个大十进制(即今天将是20130225)。我正在尝试创建一个SQL查询,它可以在月度数据库中回收。根据我的研究,似乎最好的方法是将数字除以100以切断最右边的天数(如果剩余部分被移除,则20130225/100等于201302。)

我似乎无法弄清楚如何使其发挥作用。我开始在我的Select和Group by中使用(INVOICE_DATE/100) As "INVOICE_MONTH"之类的东西。当这不起作用时,我将Group减少到"INVOICE_MONTH"然后减少到(INVOICE_DATE/100),两者都没有效果。因此,我将Select和Group by缩减为仅INVOICE_DATE/100,但似乎仍无效。

这是我当前的代码(有几个小的修改)

Select  Count(COMPETITOR_NAME) as "STORE COUNT",
    COMPETITOR_NAME,
    INVOICE_DATE/100,
    CUSTOMER_NUMBER,   
    OVERRIDE_TYPE,
    Sum (QTY_SOLD) as "Quantity Sold",
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance",
    Sum (INTERNAL_COST) as "Internal Cost"
From    DA*****.DW*******.PRCOVRWK
Where   INVOICE_DATE/100 between 201002 and 201302
Group By    ROLLUP(COMPETITOR_NAME,
    INVOICE_DATE/100),
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER
Order By    OVERRIDE_TYPE,
    COMPETITOR_NAME,
    INVOICE_DATE,
    CUSTOMER_NUMBER

我不禁想知道我的Where声明是否也引起了问题。起初我只是使用Where INVOICE_DATE between 20100225 and 20130225,但我想也许它需要使用与Select语句相同的东西? (是的,我现在有点紧张。)我一直在尽力遵循IBM网站上的文档,但我必须阅读它,因为它似乎没有按预期运行。

无论如何。基本需求是能够在每月桶中提取信息。因此,如果你知道另一种方法,那么可以实现的目标是可以接受的。我希望能够使用十进制除法来提取年/日组合并在Group By中使用它来获得我需要的结果。

PS-我们正在使用v5,1 for DB2。

5 个答案:

答案 0 :(得分:1)

十进制日期使我们的生活比他们需要的更加困难。我可以建议使用Alan Campin's IDate functions吗?它们可以让您轻松地将这些小数转换为SQL日期数据类型。完成后,您可以提取年份和月份,然后对其进行GROUP BY。

你真的在使用V5R1吗?我不认为ROLLUP早就起作用了......

答案 1 :(得分:1)

尝试将小数转换为日期。

select digits(date), 
  year(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat
    ''-'' concat substr(digits(date),7,2))) as year,
  month(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat
    ''-'' concat substr(digits(date),7,2))) as month
from ....

这里的关键是将其转换为字符,然后子串并插入正确的日期分隔符。

然后再为GROUP BY做一遍。这将是有史以来最可怕的SQL语句,但它将成为所有客户端。

答案 2 :(得分:1)

在黑暗中拍摄:您是否尝试使用INT强制数据为整数?和INT(INVOICE_DATE/100)一样?

其他“拼写”可能是INTEGER(INVOICE_DATE/100)CAST(INVOICE_DATE/100 AS INTEGER)

答案 3 :(得分:0)

我认为问题是汇总的语法。检查documentation。 。 。表达式group by rollup仅适用于所有列。所以,试试这个:

Group By ROLLUP (COMPETITOR_NAME,
    INVOICE_DATE/100,
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER)

或者使用不同组合的分组集。

另外,我建议您明确使用整数除法。因此,请将\替换为idiv

invoice_date idiv 100

答案 4 :(得分:0)

实际上答案结果相当简单。问题是我没有在Order By中正确列出该部门。这似乎不应该是重要的,但一旦我这样做,整个事情就有效了。

我最终得到了小数答案。我决定通过使用舍入来解决这个问题,这似乎进展顺利。这是我为好奇而得到的代码:

Select  Count(COMPETITOR_NAME) as "STORE COUNT",
    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0) As "Month_Date",
    CUSTOMER_NUMBER,   
    OVERRIDE_TYPE,
    Sum (QTY_SOLD) as "Quantity Sold",
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance",
    Sum (INTERNAL_COST) as "Internal Cost"
From    DA******.DW*******.PRCOVRWK
Where   INVOICE_DATE > 20100201
Group By    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0),
    OVERRIDE_TYPE,
    CUSTOMER_NUMBER
Order By    COMPETITOR_NAME,
    ROUND(INVOICE_DATE/100, 0),
    SUM (EXT_VARIANCE),
    CUSTOMER_NUMBER

所以,是的,看起来很愚蠢,DB2 V5,1真的希望我在SelectGroup ByOrder By之间进行语句匹配。嗯,几乎相同,您可以在As中使用Select,但不能在其他任何地方使用。{/ p>

希望这可以帮助其他似乎遇到类似问题的人。