2013-12-10 32 views
0

結果我有這樣SupplierLangs表: ID,供應商ID,SrcLngId,TrgLngId如何計算從細分電子郵件子查詢

它包含的數據是這樣的:

1, 1000, 1, 2 
2, 1000, 1, 3 
3, 1000, 1, 4 
4, 1000, 2, 3 
5, 1000, 2, 4 
6, 1001, 1, 2 
7, 1001, 1, 4 
8, 1001, 2, 4 
9, 1002, 3, 4 

語言表看起來像這樣: ID,LangName

1, En 
2, De 
3, Fr 
4, Pl 

這意味着供應商: 1000可以翻譯之間:

En -> De 
En -> Fr 
En -> Pl 
De -> FR 
DE -> pl 

1001可以翻譯之間:

En -> De 
En -> Pl 
De -> Pl 

1002可以翻譯之間:

Fr -> Pl 

我需要一個結果顯示有多少供應商在給定的src語言中翻譯: LANGID計數

1  2  (1000, 1001) 
2  2  (1000, 1001) 
3  1  (1002) 
4  0  (no one translate from polish) 

我實現的是隻算很多供應商是如何轉化的硬編碼語言:

select count(distinct SupplierId) from SupplierLangs 
where SupplierId in 
(
select sr.SupplierId from SupplierLangs sr 
where sr.SrcLngId = 1 
group by sr.SupplierId 
) 

根據以上數據返回2(兩家供應商從英語翻譯) 但如何擴展該所有語言都能達到上述結果?

在此先感謝

回答

0

我找到合適的查詢(但我用臨時表) - 它是沒有辦法解決它呢?

select distinct sr.SrcLngId, sr.SupplierId 
into #myTable99 
from SupplierLangs sl 

select SrcLngId, count(SrcLngId) as [count] from #myTable99 temp 
group by SrcLngId 

drop table #myTable99 

感謝他們的答覆!

0

試試這個

SELECT Count(DISTINCT supplierid) 
FROM supplierlangs 
WHERE supplierid IN (SELECT sr.supplierid 
         FROM supplierlangs sr 
         --where sr.SrcLngId = 1 --Remove this 
         GROUP BY sr.supplierid) 
HAVING Count(DISTINCT supplierid) > 0 --this will remove the record having no translation 
+0

不幸的是,這不是我所需要的 - 它只給我總數 - 一個數字。我需要在我的問題中提到的結果:所有可用語言的「LangId,Count」 – user3057544

0

這應該給你源語言,目標語言以及有多少供應商的轉換列表。

沒有加入:

SELECT SrcLngId, TrgLngId, count(*) FROM SupplierLangs 
GROUP BY SrcLngId, TrgLngId 

與聯接:

SELECT L_SRC.ID, L_TRG.ID, COUNT(*) FROM SupplierLangs 
INNER JOIN Languages AS L_SRC ON L_SRC.ID = SupplierLangs.SrcLngId 
INNER JOIN Languages AS L_TRG ON L_TRG.ID = SupplierLangs.TrgLngId 
GROUP BY L_SRC.ID, L_SRC.ID 

您可以創建從來看。

這將過濾的單一語言

SELECT L_SRC.ID, L_SRC.ID, COUNT(*) FROM SupplierLangs 
INNER JOIN Languages AS L_SRC ON L_SRC.ID = SupplierLangs.SrcLngId 
INNER JOIN Languages AS L_TRG ON L_TRG.ID = SupplierLangs.TrgLngId 
WHERE SupplierLangs.SrcLngId = 1 
GROUP BY L_SRC.ID, L_SRC.ID 

你應該有SupplierLangs對供應商ID,SrcLngId,TrgLngId唯一約束(如果你沒有的話),以避免兩次的任何數據。

/編輯: 應該工作:

SELECT SupplierSrc.SrcLngId, count(*) FROM 
(
    SELECT distinct SupplierId, SrcLngId FROM SupplierLangs AS SupplierSrc 
) 
GROUP BY SupplierSrc.SrcLngId 
+0

感謝您的複雜回覆!不幸的是,它不是我正在尋找的。第三個Snipet(刪除TrgLang後)給出了適當的「Structure」=「SrcLngId,count」,但在計數中是錯誤的。正如在我的問題中提到的,例如對於SrcLangId = 1(En)計數應爲2,因爲兩個供應商(1000和1001)可以從中翻譯 - 它不會挖掘多少trgLang。以上查詢返回這樣的數據5(而不是兩個) - 因爲有5行SrcLang = 1 – user3057544

+0

明白,請查看我的編輯 – Koryu

+0

謝謝您的回答!在我的SqlServer 2012上,它不能正確解析 - 它在Group by上強調錯誤:關鍵字'GROUP'附近的語法錯誤,期望AS ID或QUOTED_ID和SupplierSrc.SrcLngId:找不到多部分標識 – user3057544

0

如果你想返回所有的語言和供應商誰可以從這些語言翻譯的計數結果,那麼你並不需要一個對此進行慢速子查詢。您只需要連接和分組功能。請參見下面的查詢:

select SrcLngId, count(distinct supplierid) from SupplierLangs 
group by SrcLngId 

這是一個整潔的優化查詢

希望它可以幫助

利奧

+0

感謝您的支持回覆!這給了我適當的結果「結構」(「SrcLngId,count」),但是計數列中的數字是錯誤的。正如在我的問題中提到的,例如對於SrcLangId = 1(En)計數應爲2,因爲兩個供應商(1000和1001)可以從中翻譯 - 它不會挖掘多少trgLang。以上查詢返回這樣的數據5(而不是兩個) - 因爲有5行SrcLang = 1 – user3057544

+0

我的壞!但修復更容易。只需在計數功能中添加一個DISTINCT關鍵字,就可以得到您想要的結果。我在我的回答中編輯了sql查詢 – Leo

+0

感謝您的修復。但它仍然沒有達到預期的效果 - 與我自己的答案相比。 – user3057544