下面的查询根据上周内的总订单显示站点。但如果上周没有给定站点的订单,我仍然应该看到该站点的总和为零。目前它只给了我四个网站,这是因为在过去的一周没有订单为这些网站。
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
我现在已经删除了带有电话数据表的内部联接,所以我现在得到了缺少的站点。但是,我之所以避免使用这种方法,是因为如果我只依赖于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
发布于 2014-06-26 00:35:23
如果表中没有包含没有订单的站点的行,它如何返回要计数的行?也许你有一个表,里面有所有可以连接的可能的站点?或使用站点值创建临时表。然后,您可以将orders表连接到这个表。即
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
...
发布于 2014-06-26 00:35:44
尝试使用左联接而不是内联接。它可能没有从电话数据表中获取行:
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
发布于 2014-06-26 00:41:16
最好从一个"Site“表开始,然后把join留给你的结果。这个例子模仿了这种行为,可以作为一种变通方法。
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
https://stackoverflow.com/questions/24414013
复制相似问题