如何计算分组子查询的结果

时间:2013-12-10 08:21:17

标签: sql sql-server

我有 SupplierLangs 表: ID,SupplierId,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 Count

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(两个供应商翻译自英文) 但是如何扩展所有语言以实现上述结果?

提前致谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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(如果你还没有),你应该对SupplierId,SrcLngId,TrgLngId有一个独特的约束,以避免任何数据两次。

<强> /编辑: 应该工作:

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

答案 2 :(得分:0)

如果您想要返回包含所有语言的结果以及可以从这些语言翻译的供应商数量,那么您不需要缓慢的子查询。您只需要连接和分组功能。请参阅以下查询:

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

这是一个整洁的优化查询

希望有所帮助

利奥

答案 3 :(得分: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

感谢所有人的回复!