在我们的数据库中,我们有一些表使用这些行的十进制日期格式: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。
答案 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真的希望我在Select
,Group By
和Order By
之间进行语句匹配。嗯,几乎相同,您可以在As
中使用Select
,但不能在其他任何地方使用。{/ p>
希望这可以帮助其他似乎遇到类似问题的人。