首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL将不带事务的日期显示为值=0

SQL将不带事务的日期显示为值=0
EN

Stack Overflow用户
提问于 2012-07-23 18:48:42
回答 2查看 271关注 0票数 1

我在做体重报告,我有个问题。我使用这个查询来知道仓库中重量的输入,但是当某个日期没有交易时,这个日期就不会出现在结果中。

代码语言:javascript
运行
复制
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*

现在结果是这样的:

代码语言:javascript
运行
复制
Data        PES
20120720    9999999.9999
20120721    9999999.8888
20120723    9999999.7777

我需要这个

代码语言:javascript
运行
复制
Data        PES
20120720    9999999.9999
20120721    9999999.8888
20120722    0
20120723    999999.7777

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 20:26:34

使用表或视图来生成感兴趣的日期范围,并让它驱动查询。然后,将结果外部连接到此视图。这可以在查询中动态完成。例如,在Oracle中,您可以使用"connect by“生成一个序列:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-08-02 20:08:11

感谢所有人,最后我做到了这一点,并且它工作了。

代码语言:javascript
运行
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11611040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档