案例sql不起作用
我有一个select语句,我正试图为报告制作一个select语句。我让它提取数据和我需要的所有东西,但我注意到,由于我必须使用group by,它正在删除表中不存在的行。我怎样才能阻止它或使它工作案例sql不起作用,sql,group-by,case,exists,Sql,Group By,Case,Exists,我有一个select语句,我正试图为报告制作一个select语句。我让它提取数据和我需要的所有东西,但我注意到,由于我必须使用group by,它正在删除表中不存在的行。我怎样才能阻止它或使它工作 SELECT Sum(CASE WHEN direction = 'I' THEN 1 ELSE 0 END) InBound, Sum(CASE WHEN direction = 'O' THEN 1 ELSE 0 END) OutBound, Sum(CASE WH
SELECT Sum(CASE WHEN direction = 'I' THEN 1 ELSE 0 END) InBound,
Sum(CASE WHEN direction = 'O' THEN 1 ELSE 0 END) OutBound,
Sum(CASE WHEN direction = 'I' THEN p.duration ELSE 0 END) InBoundTime,
Sum(CASE WHEN direction = 'O' THEN p.duration ELSE 0 END) OutBoundTime,
u.fullname,
( CASE
WHEN EXISTS (SELECT g.goalamount
FROM [tblbrokergoals] AS g
WHERE ( g.goaldate BETWEEN
'2016-03-21' AND '2016-03-27' ))
THEN
g.goalamount
ELSE 0
END ) AS GoalAmount
FROM [tblphonelogs] AS p
LEFT JOIN [tblusers] AS u
ON u.fullname = p.phonename
LEFT OUTER JOIN [tblbrokergoals] AS g
ON u.fullname = g.brokername
WHERE ( calldatetime BETWEEN '2016-03-21' AND '2016-03-27' )
AND ( u.userid IS NOT NULL )
AND ( u.direxclude <> '11' )
AND u.termdate IS NULL
AND ( g.goaldate BETWEEN '2016-03-21' AND '2016-03-27' )
GROUP BY u.fullname,
g.goalamount;
当用户在BrokerGoals中时,它会工作并获取所有数据,但当用户不在BrokerGoals中时,它只会删除返回结果集中的那一行。当用户在brokergoals表中不存在以将该值设置为0或-因此该行不会被删除时,如何获得该值。如果您有一个brokers表,则可以将其用于左联接
如果你的经纪人有重复的名字,那么使用
SELECT b.broker_id, ....
FROM (SELECT DISTINCT broker_id
FROM brokers) b
LEFT JOIN .... ALL YOUR OTHER TABLES
....
GROUP BY b.broker_id, ....
这就是我最终解决问题的方法。我添加了Case When Exists语句,然后在then语句中选择了else it is 0。是否尝试替换Case 存在时,选择g.goalamount 来自[tblbrokergoals]作为g g.goaldate在哪里 “2016-03-21”和“2016-03-27” 然后 g、 戈拉蒙特 其他0 以GoalAmount结束
只需g.goalamount,因为where子句中已经有了日期条件,问题是您需要一个传统的左连接。几分钟前我刚刚回答了几乎完全相同的问题。如果我没有权限在数据库中创建新表,请告诉我。有时用户在brokergoals中有时不取决于他们是否在办公室,但如果他们在brokergoals中没有值,则仍应显示0。这也是我更改的内容,它仍在删除brokergoals表中不存在代理的行,因为组byI结束在select case语句中修复它时,我必须先生成select语句,然后将else设置为0,这样它才能工作。然后,错误就出现在其他地方。正如我所说的另一个问题,删除select上的agregations,只使用与GROUP BY相同的值,您将看到行不在那里
SELECT b.broker_id, ....
FROM (SELECT DISTINCT broker_id
FROM brokers) b
LEFT JOIN .... ALL YOUR OTHER TABLES
....
GROUP BY b.broker_id, ....
SELECT u.FullName,
SUM(CASE WHEN Direction = 'I' THEN 1 ELSE 0 END) AS InBound,
SUM(CASE WHEN Direction = 'O' THEN 1 ELSE 0 END) OutBound,
SUM(CASE WHEN Direction = 'I' THEN p.Duration ELSE 0 END) InBoundTime,
SUM(CASE WHEN Direction = 'O' THEN p.Duration ELSE 0 END) OutBoundTime,
CASE WHEN EXISTS (
SELECT g.GoalAmount
FROM [Portal].[dbo].[tblBrokerGoals] AS g
WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27'
AND u.FullName = g.BrokerName
) THEN (
SELECT g.GoalAmount
FROM [Portal].[dbo].[tblBrokerGoals] AS g
WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27'
AND u.FullName = g.BrokerName
) ELSE '0' END AS GoalAmount
FROM [Portal].[dbo].[tblUsers] AS u
LEFT JOIN [Portal].[dbo].[tblPhoneLogs] AS p
ON u.FullName = p.PhoneName
WHERE u.UserID IS NOT NULL
AND u.DirExclude <> '11'
AND u.TermDate IS NULL
AND p.CallDateTime BETWEEN '2016-03-21' AND '2016-03-27'
GROUP BY u.FullName