1

在我们的数据库中,我们有一些使用十进制日期格式的表格:yyyymmdd,全部为一个大小数(即,今天是 20130225)。我正在尝试创建一个 SQL 查询,将内容拉回每月存储桶中。根据我的研究,似乎最好的方法是将数字除以 100 以截断最右边的天数(如果去掉余数,则 20130225/100 等于 201302。)

我似乎无法弄清楚如何让它发挥作用。我开始(INVOICE_DATE/100) As "INVOICE_MONTH"在我的 Select 和 Group by 中使用类似的东西。当那不起作用时,我将 Group 减少了 to"INVOICE_MONTH"然后 to (INVOICE_DATE/100),这两个都不起作用。因此,我将 Select and 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 的 DB2 for i。

4

5 回答 5

1

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

你真的在 V5R1 上吗?我不认为ROLLUP那么早起作用......

于 2013-02-25T15:09:17.640 回答
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 语句,但它全是客户端。

于 2013-02-25T17:12:51.487 回答
1

在黑暗中射击:您是否尝试过使用INT强制数据为整数?如INT(INVOICE_DATE/100)?

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

于 2013-02-26T07:10:07.350 回答
0

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

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

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

另外,我建议您明确使用整数除法。所以,替换\idiv

invoice_date idiv 100
于 2013-02-25T14:16:20.047 回答
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 只是真的想让我在Select,Group ByOrder By. 好吧,几乎相同,您可以As在其中使用Select但不能在其他任何地方使用。

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

于 2013-02-28T18:44:49.037 回答