0

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

下面是 [responses] 表中一个记录列“供应商”的内容示例:

Supplier A, Supplier B, Supplier C, Supplier D

等等。

我最终希望能够查看所有答案的列表,如下所示:

  • 供应商 C:16
  • 供应商 B:14
  • 供应商 D:8
  • ETC

我目前正在通过笨重的手动子选择获得这些数字,它没有在我想要的布局中获得数据,并且由于我们有大约 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]

我无法完全控制数据的输入方式(逗号分隔字段),而 [suppliers] 表是我手动创建的,希望我能以某种方式遍历这些项目并获得计数。

关于如何获得此结果的任何想法都会导致选择供应商最多的可排序列表?

谢谢


我觉得我非常接近,但现在它只计算“供应商”是唯一选择的答案的记录,而不是计算逗号分隔列表中的任何内容,所以我觉得我有问题关于逗号的语法。

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

4

1 回答 1

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;
于 2013-08-19T15:42:36.997 回答