首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缺失数据的总和

缺失数据的总和
EN

Stack Overflow用户
提问于 2014-06-26 00:27:11
回答 3查看 78关注 0票数 0

下面的查询根据上周内的总订单显示站点。但如果上周没有给定站点的订单,我仍然应该看到该站点的总和为零。目前它只给了我四个网站,这是因为在过去的一周没有订单为这些网站。

代码语言:javascript
运行
复制
select SITE
    ,SUM(Case When  OrderDate >= dateadd(dd,(datediff(dd,-53690,getdate()-1)/7)*7,-53690)
              Then 1
            Else 0 
            End) as COMPLETED
from 
( 
   SELECT DISTINCT ORDERS.SITE, ORDERS.ORDERDATE  FROM ORDERS
   INNER JOIN PHONEDATA AS P
   ON ORDERS.RECID = P.OrderID
   where SITE IN ('SITE1','SITE2','SITE3','SITE4','SITE5','SITE6','SITE7')

) X
GROUP BY SITE
order by SITE

结果:

站点-完成

站点1-2

站点2-2

站点3-2

站点4-2

预期结果:

站点-完成

站点1-2

站点2-2

站点3-2

站点4-2

站点5-0

站点6-0

站点7-0

更新:

代码语言:javascript
运行
复制
select SITE
    ,SUM(Case When  OrderDate >= dateadd(dd,(datediff(dd,-53690,getdate()-1)/7)*7,-53690)
              Then 1
            Else 0 
            End) as COMPLETED
from 
( 
   SELECT DISTINCT ORDERS.SITE, ORDERS.ORDERDATE  FROM ORDERS

   where SITE IN ('SITE1','SITE2','SITE3','SITE4','SITE5','SITE6','SITE7')

) X
GROUP BY SITE
order by SITE

我现在已经删除了带有电话数据表的内部联接,所以我现在得到了缺少的站点。但是,我之所以避免使用这种方法,是因为如果我只依赖于orders表,那么对于给定的订单,orderdate时间字段会被插入几次,而最终的订单会被插入到phonedata表中,所以现在我在completed count中获得了更多的值,但它应该只考虑每个站点每天的最新值

更新结果:

站点-完成

站点1-5

站点2-5

站点3-5

站点4-5

站点5-0

站点6-0

站点7-0

期望的

站点-完成

站点1-2

站点2-2

站点3-2

站点4-2

站点5-0

站点6-0

站点7-0

EN

回答 3

Stack Overflow用户

发布于 2014-06-26 00:35:23

如果表中没有包含没有订单的站点的行,它如何返回要计数的行?也许你有一个表,里面有所有可以连接的可能的站点?或使用站点值创建临时表。然后,您可以将orders表连接到这个表。即

代码语言:javascript
运行
复制
create table #sites (site varchar(25));
insert into #sites values ('SITE1','SITE2','SITE3','SITE4','SITE5','SITE6','SITE7');
...
from 
( 
   SELECT DISTINCT ORDERS.SITE, ORDERS.ORDERDATE  FROM 
   #sites s left join ORDERS on orders.site = s.site
   INNER JOIN PHONEDATA AS P
   ON ORDERS.RECID = P.OrderID

) X
...
票数 0
EN

Stack Overflow用户

发布于 2014-06-26 00:35:44

尝试使用左联接而不是内联接。它可能没有从电话数据表中获取行:

代码语言:javascript
运行
复制
select SITE
    ,SUM(Case When  OrderDate >= dateadd(dd,(datediff(dd,-53690,getdate()-1)/7)*7,-53690)
              Then 1
            Else 0 
            End) as COMPLETED
from 
( 
   SELECT DISTINCT ORDERS.SITE, ORDERS.ORDERDATE  FROM ORDERS
   Left JOIN PHONEDATA AS P
   ON ORDERS.RECID = P.OrderID
   where SITE IN ('SITE1','SITE2','SITE3','SITE4','SITE5','SITE6','SITE7')

) X
GROUP BY SITE
order by SITE
票数 0
EN

Stack Overflow用户

发布于 2014-06-26 00:41:16

最好从一个"Site“表开始,然后把join留给你的结果。这个例子模仿了这种行为,可以作为一种变通方法。

代码语言:javascript
运行
复制
DECLARE @table TABLE
    (
      site VARCHAR(10) ,
      Completed TINYINT
    )
INSERT  INTO @table
        ( site, Completed )
VALUES  ( 'SITE1', 0 ),
        ( 'SITE2', 0 ),
        ( 'SITE3', 0 ),
        ( 'SITE4', 0 ),
        ( 'SITE5', 0 ),
        ( 'SITE6', 0 ),
        ( 'SITE7', 0 )

WITH    cte
          AS ( SELECT   SITE ,
                        SUM(CASE WHEN OrderDate >= DATEADD(dd,( DATEDIFF(dd, -53690, GETDATE() - 1) / 7 ) * 7, -53690)
                                 THEN 1
                                 ELSE 0
                            END) AS COMPLETED
               FROM     ( SELECT DISTINCT
                                    ORDERS.SITE ,
                                    ORDERS.ORDERDATE
                          FROM      ORDERS
                                    INNER JOIN PHONEDATA AS P ON ORDERS.RECID = P.OrderID
                          WHERE     SITE IN ( 'SITE1', 'SITE2', 'SITE3',
                                              'SITE4', 'SITE5', 'SITE6',
                                              'SITE7' )
                        )
               GROUP BY SITE
             )
    SELECT  t.site ,
            t.completed + cte.COMPLETED
    FROM    @table t
            LEFT OUTER JOIN cte ON t.site = cte.Site
    ORDER BY t.site
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24414013

复制
相关文章

相似问题

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