2013-08-19 38 views
0

我在一个表[响应]中有逗号分隔的字段,我有另一个表,其中包含逗号分隔字段[suppliers]中可以存在的所有选项。来自另一个表的SQL查询循环

所以这是一个创纪录的列“供应商”在[回应]表中的内容的一个示例:

Supplier A, Supplier B, Supplier C, Supplier D 

等。

我将最终希望能够查看所有的答案降喜欢用他们的计数的列表:

  • 供应商C:16
  • 供应商B:14
  • 供应商d:8

我目前得到这些数字与笨重的手工子选择未在布局获取数据我想,当我们有大约300家供应商

select 
    (select count(*) from dbo.responses) as TotalCount, 
    (select count(*) from dbo.responses where [suppliers] like '%Supplier C%') as [Supplier C], 
    (select count(*) from dbo.responses where [suppliers] like '%Supplier B%') as [Supplier B] 

我没有在数据怎么进来(逗号分隔场)总量控制和[供应]将是非常漫长的表是我手动建立了希望我能够以某种方式循环这些项目并得到一个计数。

关于如何获得此信息的任何想法都会导致供应商被选中的排序列表最多?

感谢


我觉得我很接近,但现在它只是计数记录在“供应商”是唯一的答案选择,并没有清点任何被划逗号的一部分列表,所以我觉得我在关于逗号的语法中有错误。

SELECT r.suppliers, COUNT(*) FROM responses AS r JOIN Suppliers s ON ','+CompanyName+',' LIKE '%,'+r.suppliers+',%' GROUP BY r.suppliers

+0

数据库RESP是什么样的。您正在使用SQL方言吗? – marderh

+2

看起来像MS SQL服务器 – Bruellhusten

+0

是的,这是在MS Sql服务器2003 – bmcnally

回答

3

如果你有所有可用的供应商的名单,你可以这样做:

select ms.name, count(*) 
from responses r join 
    mastersuppliers s 
    on ','+ms.name+',' like '%,'+r.suppliers+',%' 
group by ms.name; 

顺便说,需要做此强调你为什么不想存储此类型用逗号分隔的列表中的数据。应该有一个单独的关联表。

有了更多的工作,如果没有主列表,还可以使用递归CTE从列表中提取值。

编辑:

如果你没有一个主列表,你可以试试CTE版本,这是一样的东西:

with cte as (
     select left(r.suppliers, charindex(',', r.suppliers+',')) as suppliername, 
      substring(r.suppliers, charindex(',', r.suppliers+',') + 1, len(r.suppliers)) as rest, 
      1 as which 
     from responses 
     union all 
     select left(r.rest, charindex(',', r.rest+',')) as suppliername, 
      substring(r.rest, charindex(',', r.rest+',') + 1, len(r.rest)) as rest, 
      1 + level 
     from cte 
     where len(suppliername) > 0 
    ) 
select suppliername, count(*) 
from cte 
group by suppliername; 
+0

谢谢戈登,我觉得这是正确的路线。虽然我必须有一些联系错误。该查询将执行,但我没有得到任何结果。 (*) from dbo.Worksheet1 $ r join dbo.Sheet1 $ s on','+ CompanyName +','like'%,'+ r.suppliers +',%'供应商提供的 组; – bmcnally

+0

对不起,我是新来的堆栈,并试图找出如何添加代码片段来评论'SELECT r.suppliers,COUNT(*) FROM response AS r JOIN','+ CompanyName +','LIKE '%,'+ r.suppliers +',%' GROUP BY r.suppliers'这是正在运行,但仅在“供应商”是唯一答案的情况下才会回复。句法的逗号是否正确? – bmcnally

+0

@bmcnally。 。 。问题可能是你的逗号分隔符而不是逗号。尝试用逗号后面跟一个空格替换查询中的逗号。 –