2017-08-28 11 views
0

zählen Ich schrieb eine gespeicherte Prozedur, die drei Tabellen verbinden, um Provinztitel von seiner Tabelle zu holen. Dies ist mein Code:Zeilen holen und sie in sqlserver

BEGIN 
    select TbProvince.title, count(TbProvince.title) as cnt 
    from TbProvince 
    where TbProvince.provinceId IN (select TbCustomerUser.provinceId 
            from TbCustomerUser INNER JOIN 
             TbDeals 
             on TbCustomerUser.UserId = TbDeals.sellerUserID 
            where TbDeals.buyerUserID = 1 
            ) 
    group by TbProvince.title 
end 

Beschreibung: Ich habe drei Tabellen für Angebote, Kunden und Provinzen. Ich möchte Provinztitel und deren Anzahl für Kunden, die Verkäufer waren, abrufen. Der obige Code hat kein Problem, aber nur 1 als Zahl zurückgeben. Die Anzahl der Kunden ist mehr als eins.
Kann mir jemand helfen, mein Problem zu lösen?

+4

„als cunt“ mein Tag –

+0

@EstebanP gemacht. Ja, klar war er wütend über das Ergebnis der Zählung –

Antwort

0

Sie müssen die JOIN mit customer Tabelle durchführen. Wenn Sie Semi-Join verwenden (ausgedrückt durch IN Konstrukt in Ihrem Fall), vermeiden Sie Duplikate, die in Ihrem Fall erwartet werden.

SELECT TbProvince.title, 
     COUNT(TbProvince.title) AS cunt 
FROM TbProvince 
JOIN TbCustomerUser ON TbProvince.provinceId = TbCustomerUser.provinceId 
JOIN TbDeals ON TbCustomerUser.UserId = TbDeals.sellerUserID 
WHERE TbDeals.buyerUserID = 1 
GROUP BY TbProvince.title; 
+0

soooo gut! Vielen Dank, mein Freund. sehr hilfreich. –

+0

@masoudamirian Sie sind herzlich willkommen! –

0

sollte es so einfach sein wie:

Sie das subselect nicht brauchen. Schließen Sie sich einfach allen drei Tabellen an und Sie erhalten Ihr gewünschtes Ergebnis.

SELECT TbProvince.title, 
      count(TbProvince.title) as cunt 
     FROM TbProvince 
    INNER JOIN TbCustomerUser 
     ON TbProvince.provinceId = TbCustomerUser.provinceId 
    INNER JOIN TbDeals 
     ON TbCustomerUser.UserId = TbDeals.sellerUserID 
     AND TbDeals.buyerUserID = 1 
    GROUP BY TbProvince.title 

Warum hat Ihre Lösung nicht funktioniert? Sie subselect wird eine "Liste" von provinceIDs von TbCustomerUser in Kombination mit TbDeals mit Ihrer Einschränkung TbDeals.buyerUserID = 1 zurückgeben. Die äußere Auswahl gibt jetzt alle Zeilen von TbProvince in dieser Liste zurück. Aber es gibt keine Zeile für jeden Kunden, der einen Deal hatte. Deshalb müssen Sie JOIN alle drei Tabellen gleichzeitig.

+0

vielen Dank. Ich bin verwirrt! weil ich ORM benutze. Danke! –

0

Ihre Abfrage filtert die Zeilen von TbProvince und aggregiert dann diese Tabelle - und nur diese Tabelle.

Stattdessen möchten Sie die Tabellen miteinander verbinden, die Kunden zählen zu dürfen nicht die Provinzen. Die Abfrage ist viel einfacher zu schreiben und zu lesen, wenn Sie Tabellen-Aliases verwenden:

select p.Title, count(*) 
from TbCustomerUser cu join 
    TbDeals d 
    on cu.UserId = d.sellerUserID join 
    TbProvince p 
    on p.provinceId = cu.provinceId 
where d.buyerUserID = 1 
group by p.Title;