2012-07-23 143 views
1

我正在做体重报告,并且遇到问题。我使用此查询来了解仓库中的重量输入情况,但是如果日期中没有交易,则此日期不会显示在结果中。SQL显示没有交易的日期,值= 0

SELECT erp.MKPF.BUDAT AS Data, 
Sum(erp.MSEG.MENGE * erp.MARM.BRGEW) as pes 

From erp.MKPF 
INNER Join erp.MSEG on erp.MKPF.MANDT = erp.MSEG.MANDT and erp.MKPF.MBLNR = erp.MSEG.MBLNR 
INNER Join erp.MARM on erp.MSEG.MANDT = erp.MARM.MANDT and erp.MSEG.MATNR = erp.MARM.MATNR And erp.MSEG.MEINS = erp.MARM.MEINH 
INNER JOIN erp.MARA on erp.MSEG.MANDT = erp.MARA.MANDT and erp.MSEG.MATNR = erp.MARA.MATNR 

WHERE erp.MKPF.MANDT = '100' 
and erp.MKPF.BUDAT >= '20120720' 
and erp.MKPF.BUDAT <= CONVERT(VARCHAR(8), GETDATE(), 112) -1 
and erp.MSEG.LGORT in ('1001','1069') 
and erp.MSEG.BWART In ('101','102','311','312') 
and erp.MSEG.WERKS = '1001' 
and erp.MARA.MTART in ('Z001','Z010','Z002','Z02E') 

GROUP BY erp.MKPF.BUDAT* 

现在的结果是这样的:

Data  PES 
20120720 9999999.9999 
20120721 9999999.8888 
20120723 9999999.7777 

,我需要这个

Data  PES 
20120720 9999999.9999 
20120721 9999999.8888 
20120722 0 
20120723 999999.7777 

有人可以帮助我吗?

+0

我所知,没有简单的方法来修改您的查询来获取你想要的数据集。数据如何最终呈现给用户?这可能是一个更好/更容易的地方来添加显示逻辑来填充0值的空日期。 – paul 2012-07-23 10:56:38

+1

如果您构建辅助日期表并在budat上将其加入MKPF,您将获得缺少日期。过滤条件应应用于日期表。 – 2012-07-23 10:59:48

+0

忽略我删除的答案 - 完全误读了问题。在这里同意尼古拉,虽然这应该给你一些想法。 http://weblogs.sqlteam.com/jeffs/archive/2007/09/10/group-by-month-sql.aspx – raven 2012-07-23 11:10:37

回答

0

使用表格或视图来生成感兴趣的日期范围并让此驱动器查询。然后你外面加入你的结果到这个视图。这可以在查询中动态完成。例如,在Oracle中,你可以使用“连接通过”生成一系列:

create table my_summary(the_day date, pes number); 
insert into my_summary values(to_date('20120720', 'yyyymmdd'), 9999999.9999); 
insert into my_summary values(to_date('20120721', 'yyyymmdd'), 9999999.8888); 
insert into my_summary values(to_date('20120723', 'yyyymmdd'), 9999999.7777); 

SELECT d.the_day, NVL(s.pes, 0) AS pes 
    FROM (SELECT to_date('20120720', 'yyyymmdd') + level -1 AS the_day 
      FROM dual CONNECT BY level <= 4) d 
     LEFT OUTER JOIN my_summary s ON (d.the_day = s.the_day) 
    ORDER BY 1 

THE_DAY PES 
--------- --- 
20-JUL-12 9999999.9999 
21-JUL-12 9999999.8888 
22-JUL-12 0 
23-JUL-12 9999999.7777 

其他RDBMS有其他的方法来生成一个系列。这将要求你知道你想要的开始日期和记录数(在20120720和4以上的例子中)。

0

感谢所有,最后我做到这一点,它的工作原理

SELECT 
    c.BUDAT AS DATA, 
    CASE When SAP.pes Is Null then '0' 
    ELSE SAP.pes 
    END 
From 
    erp.YSD_CALENDAR as c LEFT JOIN 

    (SELECT 
    erp.MKPF.BUDAT, 
    Sum(
    erp.MSEG.MENGE 
    * erp.MARM.BRGEW) as pes 
    FROM 
    erp.MKPF 

INNER Join erp.MSEG on erp.MKPF.MANDT = erp.MSEG.MANDT and erp.MKPF.MBLNR = erp.MSEG.MBLNR 

INNER Join erp.MARM on erp.MSEG.MANDT = erp.MARM.MANDT and erp.MSEG.MATNR = erp.MARM.MATNR And erp.MSEG.MEINS = erp.MARM.MEINH 

INNER JOIN erp.MARA on erp.MSEG.MANDT = erp.MARA.MANDT and erp.MSEG.MATNR = erp.MARA.MATNR 

WHERE 
    erp.MKPF.MANDT = '100' 
and erp.MKPF.BUDAT >= '20120720' 
and erp.MSEG.LGORT in ('1001','1069') 
and erp.MSEG.BWART In ('101','102','311','312') 
and erp.MSEG.WERKS = '1001' 
and erp.MARA.MTART in ('Z001','Z010','Z002','Z02E') 
and erp.MSEG.SHKZG = 'S' 
GROUP BY erp.MKPF.BUDAT 
) SAP ON SAP.BUDAT = c.BUDAT 

WHERE 
c.BUDAT >= '20120720' 
and c.BUDAT <= CONVERT(VARCHAR(8), GETDATE(), 112) 

GROUP BY c.BUDAT, SAP.pes 
ORDER BY c.BUDAT