2016-07-11 13 views
1

Meine Abfrage funktioniert einwandfrei, um Datensätze mit echten Werten zu finden, aber ich brauche auch meine Abfrage Datensätze mit Nullwerten anzeigen. Bisher haben meine Versuche, diese Abfrage neu zu erstellen, um auch Nullwerte anzuzeigen, dazu geführt, dass mindestens eine meiner Ergebnisspalten verloren gegangen ist. Jetzt suche ich nach Hilfe.SQL-Abfrage, um gute Datensätze sowie null Datensätze anzuzeigen

Das ist meine Abfrage ist so weit:

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 

Dies ist zur Zeit zeigen, was meine Abfrageergebnisse:

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 

Dies ist, was ich meine Abfrageergebnisse wollen zeigen:

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 

Antwort

3

Ich schlage vor, Sie verwenden RIGHT JOIN anstelle von INNER JOIN. Sie sollten dann die Zeilen von Customer behalten, die keine übereinstimmenden Zeilen in TransactionSummary haben.

Sie können auch die Abfrage wie folgt umgestalten, so dass Sie LEFT JOIN verwenden. Die nächste Person, die an der Abfrage arbeitet, wird es Ihnen danken. LEFT JOIN Operationen sind häufiger.

FROM [log].[dbo].[Customer] c 
LEFT JOIN [log].[dbo].[TransactionSummary] t 
on t.CustNo = c.CustNo 
and t.City = c.City 
+0

abfragen möge Wenn ich 'RECHTS JOIN' ich ein paar zusätzlichen Ergebnisse bekommen, aber sie zeigen die CustName = NULL, wenn ich sein soll Erhalten von 'sum (t.TransactionCount) als TransactionCountTotal' gleich NULL – jwabsolution

+0

Versuchen Sie LEFT JOIN, wie ich gezeigt habe. –

+0

Es tut mir leid, ich versuchte Linke Join und teilte die Ergebnisse in der Antwort unter diesem. Ich fühlte, dass das Hinzufügen der Informationen über Right Join auch hilfreich gewesen sein könnte, so dass ich diese Ergebnisse unter dieser Antwort gepostet habe. – jwabsolution

0

jwabsolution, Ihr Problem ergibt sich aus dem Ergreifen aller Transaktionen statt aller Kunden. Mein Verstand funktioniert auf diese Weise: Sie möchten alle Kunden auswählen & finden Sie alle Transaktionszustände. Daher sollten Sie aus der Kundentabelle auswählen. Außerdem sollten Sie den INNER JOIN nicht verwenden oder Sie werden alle Kunden ignorieren, die keine Transaktionen haben. Verwenden Sie stattdessen links die Transaktionstabelle. Auf diese Weise erhalten Sie alle Kunden (auch solche ohne Transaktionen). Hier ist eine gute visuelle für SQL verbindet: http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

So Ihre Abfrage sollte wie folgt aussehen:

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

Leider gibt mir das ein identisches Ergebnis, aber ich werde weitermachen, vielleicht übersehe ich etwas - es war ein langes Wochenende. – jwabsolution

0

es behoben. Erforderlich, um die Koaleszenz zu verwenden, damit die Werte richtig angezeigt werden.

auch noch eine „where“ Option, wenn ich einzelne Kunden

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