2017-08-28 42 views
0

我編寫了一個存儲過程,它加入了三個表來從它的表中獲取省標題。這是我的代碼:提取行並在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 

說明:我有優惠,客戶和省三個表。我想檢索賣家的客戶的省​​份名稱和數量。 上面的代碼沒有問題,但只返回1作爲計數。客戶數量不止一個。
任何人都可以幫我解決我的問題嗎?

+4

「作爲陰戶」讓我很快樂 –

+0

@EstebanP。是的,顯然他很生氣,關於計數結果 –

回答

0

您必須執行JOINcustomer表。如果你使用半連接(在你的情況下表示爲IN構造),那麼你避免了你的情況下預期的重複。

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好!非常感謝我的朋友。很有幫助。 –

+0

@masoudamirian歡迎您! –

0

它應該是這麼簡單:

你不需要子選擇。只需加入所有三張桌子,你就會收到你想要的結果。

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 

爲什麼您的解決方案無法正常工作? 您選擇將從TbCustomerUser結合TbDeals返回provinceIDs的「列表」,並附上您的限制TbDeals.buyerUserID = 1。 外部選擇現在將返回此列表中的所有來自TbProvince的行。 但是它沒有爲每個有交易的客戶返回一行。 這就是爲什麼你必須立即JOIN所有三個表。

+0

非常感謝。我很困惑!因爲我使用ORM。謝謝! –

0

您的查詢正在過濾TbProvince的行,然後聚合該表 - 並僅聚合該表。

相反,你想加入表一起計數客戶不是。查詢簡單得多寫入和讀取,如果你使用表別名:

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; 
相關問題