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。然后应保留CustomerTransactionSummary中没有匹配行的行。

您可能还想重构这样的查询,因此您使用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 
+0

当我使用'右JOIN'我得到一些额外的结果,但他们表现出CUSTNAME = NULL时,我应该是将sum(t.TransactionCount)作为TransactionCountTotal'等于NULL – jwabsolution

+0

按照我的说明尝试LEFT JOIN。 –

+0

对不起,我尝试了Left Join,并在下面的答案中分享了结果。我觉得添加有关Right Join的信息可能也有帮助,所以我在这个答案下发布了这些结果。 – jwabsolution

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 
+0

不幸的是,这给了我一组相同的结果,但我会继续这样做,也许我忽略了一些东西 - 这是一个漫长的周末。 – 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