我不能添加零值而不是null,这是我的sql:
SELECT
S.STOCK_ID,
S.PRODUCT_NAME,
SUM(COALESCE(AMOUNT,0)) AMOUNT,
DATEPART(MM,INVOICE_DATE) AY
FROM
#DSN3_ALIAS#.STOCKS S
LEFT OUTER JOIN DAILY_PRODUCT_SALES DPS ON S.STOCK_ID = DPS.PRODUCT_ID
WHERE
MONTH(INVOICE_DATE) >= #attributes.startdate# AND
MONTH(INVOICE_DATE) < #attributes.finishdate+1#
GROUP BY
DATEPART(MM,INVOICE_DATE),
S.STOCK_ID,
S.PRODUCT_NAME
ORDER BY
S.PRODUCT_NAME
和我的表:
<cfoutput query="get_sales_total" group="stock_id">
<tr height="20" class="color-row">
<td>#product_name#</td>
<cfoutput group="ay"><td><cfif len(amount)>#amount#<cfelse>0</cfif></td></cfoutput>
</tr>
</cfoutput>
我想要的结果:
我得到的结果是:
谢谢大家的帮助!
+编辑:
我使用了交叉连接技术,重写了sql:
SELECT
SUM(COALESCE(AMOUNT,0)) AMOUNT,S.STOCK_ID,S.PRODUCT_NAME,DPS.AY
FROM
#DSN3_ALIAS#.STOCKS S
CROSS JOIN (SELECT DISTINCT <cfif attributes.time_type eq 2>DATEPART(MM,INVOICE_DATE) AY<cfelse>DATEPART(DD,INVOICE_DATE) AY</cfif>
FROM DAILY_PRODUCT_SALES) DPS
LEFT OUTER JOIN DAILY_PRODUCT_SALES DP ON S.STOCK_ID = DP.PRODUCT_ID AND
<cfif attributes.time_type eq 2>DATEPART(MM,DP.INVOICE_DATE)<cfelse>DATEPART(DD,DP.INVOICE_DATE)</cfif> = DPS.AY
WHERE
<cfif attributes.time_type eq 2>
MONTH(INVOICE_DATE) >= #attributes.startdate# AND
MONTH(INVOICE_DATE) < #attributes.finishdate+1#
<cfelse>
MONTH(INVOICE_DATE) = #attributes.startdate#
</cfif>
<cfif len(trim(attributes.product_cat)) and len(attributes.product_code)>
AND S.STOCK_CODE LIKE '#attributes.product_code#%'
</cfif>
GROUP BY DPS.AY,S.STOCK_ID,S.PRODUCT_NAME
ORDER BY DPS.AY,S.STOCK_ID,S.PRODUCT_NAME
结果是:
答案 0 :(得分:1)
改用CASE
SUM(如果A为空,则为0,结束时为
)答案 1 :(得分:1)
您可以像Lasse建议的那样在数据库中执行此操作,或者您可以将每个输出值包装在Val
函数中,如下所示:
<cfoutput group="ay"><td>#Val(amount)#</td></cfoutput>
Val
函数会将任何非数字值转换为0.
答案 2 :(得分:1)
您可以使用ISNULL,即;
SUM(ISNULL(AMOUNT,0)) AMOUNT,
编辑:好的,鉴于问题似乎是缺少值而不是空值。试试这样的事情。
首先,创建一个永久的reporting_framework表。这个基于几个月和几年,但如果你愿意,你可以把它延长到几天。
create table reporting_framework
([month] smallint, [year] smallint);
go
declare @year smallint;
declare @month smallint;
set @year=2000;
while @year<2500
begin
set @month=1;
while @month<13
begin
insert into reporting_framework ([month], [year]) values (@month, @year);
set @month=@month+1;
end
set @year=@year+1;
end
select * from reporting_framework;
create table reporting_framework
([month] smallint, [year] smallint);
go
declare @year smallint;
declare @month smallint;
set @year=2000;
while @year<2500
begin
set @month=1;
while @month<13
begin
insert into reporting_framework ([month], [year]) values (@month, @year);
set @month=@month+1;
end
set @year=@year+1;
end
select * from reporting_framework;
(这给你6000行,从2000到2499 - 根据口味调整!)
现在我们将制作零件表和订单表
现在这是您查询的表格,例如;
create table parts
([part_num] integer, [description] varchar(100));
go
insert into parts (part_num, [description]) values (100, 'Widget');
insert into parts (part_num, [description]) values (101, 'Sprocket');
insert into parts (part_num, [description]) values (102, 'Gizmo');
insert into parts (part_num, [description]) values (103, 'Foobar');
create table orders
([id] integer, part_num integer, cost numeric(10,2), orderdate datetime);
go
insert into orders ([id], part_num, cost, orderdate) values
(1, 100, 49.99, '2011-10-30');
insert into orders ([id], part_num, cost, orderdate) values
(2, 101, 109.99, '2011-10-31');
insert into orders ([id], part_num, cost, orderdate) values
(3, 100, 47.99, '2011-10-31');
insert into orders ([id], part_num, cost, orderdate) values
(4, 102, 429.99, '2011-11-01');
insert into orders ([id], part_num, cost, orderdate) values
(5, 101, 111.17, '2011-11-01');
insert into orders ([id], part_num, cost, orderdate) values
(6, 101, 111.17, '2011-11-01');
insert into orders ([id], part_num, cost, orderdate) values
(7, 103, 21.00, '2011-09-15');
这个例子有帮助吗?可能有很多更好的方法(hello StackOverflow),但它可能会让你开始思考你的问题是什么。 不是CROSS JOIN获取所有零件/日期组合,然后是FULL OUTER JOIN以获得订单。 'where'子句只是控制你的日期范围。