Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 缺失数据之和_Sql Server_Tsql - Fatal编程技术网

Sql server 缺失数据之和

Sql server 缺失数据之和,sql-server,tsql,Sql Server,Tsql,下面的查询显示上周内总订单的站点。 但是,如果上周没有一个给定站点的订单,我仍然会看到一个和为零的站点。 目前它只给了我四个网站,这是因为在过去的一周里没有为这些网站下订单 select SITE ,SUM(Case When OrderDate >= dateadd(dd,(datediff(dd,-53690,getdate()-1)/7)*7,-53690) Then 1 Else 0 End)

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

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

更新:

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
我现在已经删除了与电话数据表的内部连接,所以我现在得到了丢失的站点。但是我之所以避免这种方法是因为如果我只依赖于Orror表,OrrordDead时间字段只针对给定的顺序插入几次,并且最后的顺序使它进入PooDead表,所以现在我在完成的计数中得到更多的值,但是它只考虑每一个站点的最新值

。 更新结果:

现场------------------已完成

地点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


SITE7-----------------0

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

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
...

尝试使用左连接而不是内部连接。它可能无法从电话数据表中获取行:

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

最好从一个“Site”表开始,然后留下连接到结果。此示例模拟了该行为,可以用作黑客解决方案

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

您是否有一个表来标识所有站点?一个站点在一天内可以合法地有两个订单吗?如果是这样,你的新方法会想念他们。我有更新的问题,请考虑更新的问题我已经更新了问题,请考虑更新的问题上面我有更新的问题,请考虑更新的问题。