2016-07-11 210 views
1

我的查詢非常適用於查找具有實際值的記錄,但是,我還需要查詢以顯示具有空值的記錄。到目前爲止,我嘗試重新創建此查詢以顯示空值,結果至少丟失了我的結果列中的一列,所以現在我正在尋求幫助。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 

回答

3

我建議你用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

0

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

0

固定它。需要使用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