2016-06-03 5 views
0

I 3 Tabellen habe hat unterWie dieser Server in SQL zur Abfrage

tbMaster 
Branch_code Sale_No Amount Type_Code 
------------------------------------- 
0   1222 421.00 9 
0   1227 323.00 9 
0   1228 1186.00 9 
0   1223 119.00 2 

gezeigt und

tType 
Type_Code Type_Name 
1    NTB 
2    TABLE SERVICE 
3    A/C TABLE SERVICE 
4    TAKE AWAY 
5    CAR SERVICE 
6    HOME DELIVERY 
7    SELF SERVICE 

und schließlich

tFree 
Type_Code Branch_code Amount 
----------------------------------- 
1   0    261.00 
1   0    112.20 
1   0    336.60 

Jetzt bekomme ich die Ausgabe als sagen zum Beispiel

Branch_code TypeTcount SaleValue Type_Name 
NULL   0  0.00   NTB 
0    1  910.00  TABLE SERVICE 
NULL   0  0.00   A/C TABLE SERVICE 
NULL   0  0.00   TAKE AWAY 
NULL   0  0.00   CAR SERVICE 
NULL   0  0.00   HOME DELIVERY 
NULL   0  0.00   SELF SERVICE 
Jetzt

meine Frage ist

SELECT 
    sm.Branch_code, 
    COUNT(sm.Sale_No) TypeTcount, 
    ISNULL(SUM(sm.Amount), 0) SaleValue, 
    t.Type_Name 
FROM [tMaster] sm 
RIGHT JOIN [tType] t 
    ON sm.Type_Code = t.Type_Code 
    AND sm.Branch_code = 0 
GROUP BY 
    t.Type_Name, 
    t.Type_Code 
ORDER BY t.Type_Code 

Aber ich möchte die Anzahl der Type_code aus der Tabelle tFree in der Ausgabe TypeTCount erhalten.

Erwartetes Ergebnis:

Branch_code TypeTcount SaleValue Type_Name 
    NULL   3  709.80  NTB 
    0    1  910.00  TABLE SERVICE 
    NULL   0  0.00   A/C TABLE SERVICE 
    NULL   0  0.00   TAKE AWAY 
    NULL   0  0.00   CAR SERVICE 
    NULL   0  0.00   HOME DELIVERY 
    NULL   0  0.00   SELF SERVICE 

Nur zeigen die tFree Tabellensätze in der Nähe von NTB

+2

Bitte veröffentlichen Sie das erwartete Ergebnis. –

Antwort

0

Ohne den Rest Ihrer Abfrage zu beeinflussen, könnten Sie eine correlated subquery versuchen, diese Zählung zu erhalten:

SELECT 
    sm.Branch_code, 
    -- Correlated subquery to count rows: 
    (select count(*) from tFree where Type_Code = t.Type_Code) TypeTcount, 
    ISNULL(SUM(sm.Amount), 0) SaleValue, 
    t.Type_Name 
FROM [tMaster] sm 
RIGHT JOIN [tType] t 
    ON sm.Type_Code = t.Type_Code 
    AND sm.Branch_code = 0 
GROUP BY 
    t.Type_Name, 
    t.Type_Code 
ORDER BY t.Type_Code 

Beachten Sie, dass dies im Vergleich zu einem Join jedoch oft zu einer Leistungseinbuße führen kann, da es wahrscheinlich die Zählung ausführen wird als eine verschachtelte Schleife. Hier ist eine Möglichkeit dies als beitreten zu tun:

SELECT 
    sm.Branch_code, 
    COUNT(t.Type_Code) TypeTcount, 
    ISNULL(SUM(sm.Amount), 0) SaleValue, 
    t.Type_Name 
FROM [tMaster] sm 
RIGHT JOIN [tType] t 
    ON sm.Type_Code = t.Type_Code 
    AND sm.Branch_code = 0 
-- Join table to count rows: 
LEFT JOIN [tFree] f 
    ON t.Type_Code = f.Type_Code 
GROUP BY 
    t.Type_Name, 
    t.Type_Code 
ORDER BY t.Type_Code 

Letzte, was zu erwähnen ist, dass ich nicht richtig etwas getan mit Branch_Code oder Ihrem Beispiel Abfrage über die Zählung in Frage zu tun. Ich vertraue Ihren Beispieldaten noch nicht voll und so habe ich den Rest Ihrer Abfrage alleine gelassen, obwohl es aussieht, als würde es eine Ausnahme auslösen.

0
SELECT 
    sm.Branch_code, 
    COUNT(sm.Sale_No) TypeTcount, 
    ISNULL(SUM(sm.Amount), 0) SaleValue, 
    t.Type_Name, 
    (SELECT Count(Type_code) FROM tFree WHERE tFree.Type_Code = t.Type_Code AND tFree.Branch_code = sm.Branch_code) AS Count_of_Type_code 
FROM [tMaster] sm 
RIGHT JOIN [tType] t 
    ON sm.Type_Code = t.Type_Code 
    AND sm.Branch_code = 0 
GROUP BY 
    sm.Branch_code 
    t.Type_Name, 
    t.Type_Code 
ORDER BY t.Type_Code 
+1

Anhand der Beispieldaten ist schwer zu sagen, ob Branch_Code hier verwendet werden kann oder soll. –