Sql server SQL-查询不存在的记录为空
我希望这些记录能不经我的质疑就寄来。 请帮帮我。现在谢谢你Sql server SQL-查询不存在的记录为空,sql-server,Sql Server,我希望这些记录能不经我的质疑就寄来。 请帮帮我。现在谢谢你 SELECT ROUTE_ID, ISNULL(COUNT(*), 0) AS TOTAL_CALL FROM dbo.tblCall_Report AR CROSS JOIN tblRoute R INNER JOIN tblNotification_Report BR ON R.ROUTE_ID = BR.RouteID WHERE CAST(BR.Notificatio
SELECT
ROUTE_ID,
ISNULL(COUNT(*), 0) AS TOTAL_CALL
FROM
dbo.tblCall_Report AR
CROSS JOIN
tblRoute R
INNER JOIN
tblNotification_Report BR ON R.ROUTE_ID = BR.RouteID
WHERE
CAST(BR.NotificationDateTime AS DATE) = '04.01.2017'
AND BR.CallNotification = 1
AND (BR.NotificationStatus = 1 OR BR.NotificationStatus IS NULL)
AND BR.RouteID IN (7434,7423)
GROUP BY
ROUTE_ID
tblCall\u报告
NotificationDateTime
----------------------
2017-04-01
TBL通知报告
NotificationDateTime RouteID
--------------------------------
2017-04-01 7434
结果:
ROUTE_ID | TOTAL_CALL
----------+-----------
7434 | 1
我想要这些结果:
ROUTE_ID | TOTAL_CALL
---------+-----------
7434 | 1
7423 | 0
如果原始表中存在路由
7423
,那么我猜内部连接正在过滤掉该路由。改用左连接
:
SELECT ROUTE_ID,
ISNULL(COUNT(*),0) AS TOTAL_CALL
FROM dbo.tblCall_Report AR
CROSS JOIN tblRoute R
LEFT JOIN tblNotification_Report BR
ON R.ROUTE_ID = BR.RouteID AND
BR.RouteID IN (7434, 7423)
WHERE CAST(BR.NotificationDateTime AS DATE) = '04.01.2017' AND
BR.CallNotification = 1 AND
(BR.NotificationStatus =1 OR BR.NotificationStatus IS NULL)
GROUP BY ROUTE_ID
您应该使用LEFT-OUTER-JOIN
,并且需要相应地修改WHERE
子句。检查下面的查询
SELECT
ROUTE_ID,
SUM(CASE WHEN BR.RouteID IS NOT NULL THEN 1 ELSE 0 END) AS TOTAL_CALL
FROM
dbo.tblCall_Report AR
CROSS JOIN
tblRoute R
LEFT JOIN
tblNotification_Report BR ON R.ROUTE_ID = BR.RouteID
AND CAST(BR.NotificationDateTime AS DATE) = '04.01.2017'
AND BR.CallNotification = 1
AND (BR.NotificationStatus = 1 OR BR.NotificationStatus IS NULL)
WHERE R.Route_ID IN (7434,7423)
GROUP BY
ROUTE_ID
下面是我得到的结果
希望这对您有所帮助。您需要:
- 使用
左连接
- 使用可为空的值将操作数移动到
- 在where中使用
R
,因为它肯定有一个值
挑选
路线号,
CASE ISNULL(MIN(BR.RouteID),0时为0,然后0 ELSE计数(*)作为TOTAL_调用结束
从…起
dbo.tblCall_报告AR
交叉连接
tblRoute
左连接
TBL通知\u报告BR在R.ROUTE\u ID=BR.RouteID上
和演员阵容(BR.NotificationDateTime AS DATE)='04.01.2017'
和BR.CallNotification=1
和(BR.NotificationStatus=1或BR.NotificationStatus为空)
分组
其中R.RouteID位于(74347423)
路线号
route7423
是否出现在您的原始数据集中?是的,tim BiegeleisenI认为您可能需要一个左外连接来代替内连接实际上where子句会使其仍然过滤掉记录-使其成为on子句的一部分,并使where子句R.RouteID进入(74347423)@JamesCasey我想你已经把它倒过来了,IN
中的条件应该从WHERE
子句移到ON
子句,以避免过早地过滤掉记录。结果是一样的。耶。。。我当天删除的第一个答案你能将我的电脑与Teamviewer连接吗?我根据James Casey的建议更新了我的查询。请再试一次。结果是一样的(结果:路由ID:7434 |呼叫总数:1,路由ID:7423 |呼叫总数:1@RızaSoylu MaxJoffrey我已更新我的答案以获得正确的结果。您的代码假定最多可以有一行。什么是错误?列“TCALL.TOTAL_CALL”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY中子句。@RızaSoylu-MaxJoffrey您在select语句中包含了任何字段吗?@RızaSoylu-MaxJoffrey感谢您指出这一点。我已经编辑了我的答案来解决这个问题。