SQL查询显示良好的记录以及空记录
我的查询非常适用于查找具有实际值的记录,但是,我还需要查询以显示具有空值的记录。到目前为止,我尝试重新创建此查询以显示空值,结果至少丢失了我的结果列中的一列,所以现在我正在寻求帮助。SQL查询显示良好的记录以及空记录
这是迄今为止我的查询:
SELECT sq.*, sq.TransactionCountTotal - sq.CompleteTotal as InProcTotal from
(
select
c.CustName,
t.[City],
sum (t.TransactionCount) as TransactionCountTotal
sum (
case
when (
[format] in (23,25,38)
or [format] between 400 and 499
or format between 800 and 899
)
then t.TransactionCount
else 0
end
) as CompleteTotal
FROM [log].[dbo].[TransactionSummary] t
INNER JOIN [log].[dbo].[Customer] c
on t.CustNo = c.CustNo
and t.City = c.City
and t.subno = c.subno
where t.transactiondate between '7/1/16' and '7/11/16'
group by c.CustName,t.City
) sq
这是目前什么我的查询结果表明:
CustName City InProcTotal TransactionCountTotal Complete Total
Cust 1 City(a) 23 7 30
Cust 2 City(b) 74 2 76
Cust 3 City(c) 54 4 58
这是我希望我的查询结果显示什么:
CustName City InProcTotal TransactionCountTotal Complete Total
Cust 1 City(a) 23 7 30
Cust 2 City(b) 74 2 76
Cust 3 City(c) 54 4 58
Cust 4 City(d) 0 0 0
Cust 5 City(e) 0 0 0
我建议你用RIGHT JOIN
代替INNER JOIN
。然后应保留Customer
中TransactionSummary
中没有匹配行的行。
您可能还想重构这样的查询,因此您使用LEFT JOIN
。接下来要处理查询的人会感谢你; LEFT JOIN
操作比较常见。
FROM [log].[dbo].[Customer] c
LEFT JOIN [log].[dbo].[TransactionSummary] t
on t.CustNo = c.CustNo
and t.City = c.City
jwabsolution,您的问题源于抓住所有交易而不是所有客户。我的想法是这样工作的:你想选择所有的客户&找到所有的交易状态。因此,您应该从客户表中进行选择。此外,您不应使用INNER JOIN,否则您将忽略任何没有交易的客户。相反,使用左侧加入交易表。通过这种方式,您将检索所有客户(即使没有交易的客户)。这里是一个很好的视觉为SQL连接:http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg
所以您的查询应该是这样的:
SELECT sq.*, sq.TransactionCountTotal - sq.CompleteTotal as InProcTotal from
(
select
c.CustName,
t.[City],
sum (t.TransactionCount) as TransactionCountTotal
sum (
case
when (
[format] in (23,25,38)
or [format] between 400 and 499
or format between 800 and 899
)
then t.TransactionCount
else 0
end
) as CompleteTotal
FROM [log].[dbo].[Customer] c
LEFT JOIN [log].[dbo].[TransactionSummary] t
on c.CustNo = t.CustNo
and c.City = t.City
and c.subno = t.subno
where t.transactiondate between '7/1/16' and '7/11/16'
group by c.CustName,t.City
) sq
不幸的是,这给了我一组相同的结果,但我会继续这样做,也许我忽略了一些东西 - 这是一个漫长的周末。 – jwabsolution
固定它。需要使用coalesce来使值正确显示。
还增加了一个“where”的选项,如果我想查询个人客户
SELECT sq.* ,sq.TransactionCountTotal - sq.CompleteTotal as [InProcTotal]
from
(
select
c.custname
,c.port
,sum(coalesce(t.transactioncount,0)) as TransactionCountTotal
,sum(
case when (
[format]in(23,25,38)
or[format]between 400 and 499
or[format]between 800 and 899)
then t.TransactionCount
else 0
end) as CompleteTotal
from log.dbo.customer c
left join log.dbo.TransactionSummary t
on c.custNo=t.custno
and c.subno=t.subno
and c.city=t.city
and t.transactiondate between '7/1/16' and '7/12/16'
/*where c.custname=''*/
group by c.custname,c.city
) sq
当我使用'右JOIN'我得到一些额外的结果,但他们表现出CUSTNAME = NULL时,我应该是将sum(t.TransactionCount)作为TransactionCountTotal'等于NULL – jwabsolution
按照我的说明尝试LEFT JOIN。 –
对不起,我尝试了Left Join,并在下面的答案中分享了结果。我觉得添加有关Right Join的信息可能也有帮助,所以我在这个答案下发布了这些结果。 – jwabsolution