来自另一个表的SQL Query循环

时间:2013-08-19 15:38:13

标签: sql

我在一个表[response]中有一个逗号分隔的字段,我有另一个表格,其中包含逗号分隔字段[供应商]中可以存在的所有选项。

所以这里是[response]表中一个记录栏'供应商'的内容示例:

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

1 个答案:

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