Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自另一个表的SQL查询循环_Sql - Fatal编程技术网

来自另一个表的SQL查询循环

来自另一个表的SQL查询循环,sql,Sql,我在一个表[responses]中有一个逗号分隔的字段,在另一个表中有该逗号分隔的字段[suppliers]中可能存在的所有选项 下面是[responses]表中一个记录列“suppliers”的内容示例: Supplier A, Supplier B, Supplier C, Supplier D 等等 我最终希望能够查看所有答案的列表,这些答案按如下顺序递减: 供应商C:16 供应商B:14 供应商D:8 等 我现在用一个笨重的手动子选择来获取这些数字,它不能获取我想要的布局中的数据,

我在一个表[responses]中有一个逗号分隔的字段,在另一个表中有该逗号分隔的字段[suppliers]中可能存在的所有选项

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

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]
我无法完全控制数据的输入方式(逗号分隔的字段),而[suppliers]表是我手动创建的,希望能够以某种方式循环这些项目并获得计数

关于如何在一个可排序的列表中获得这一结果,哪些供应商被选中最多,有什么想法吗

谢谢


我觉得我很接近,但现在它只是计算记录,其中“供应商”是唯一选择的答案,并且没有计算逗号分隔列表中的任何内容,所以我觉得逗号的语法有问题

选择r.供应商,计数(*)
从作为r JOIN的响应
“,”+CompanyName+“,”如“,”+r.Suppliers+“,%”上的供应商s

按r.供应商分组

如果您有所有可用供应商的列表,您可以执行以下操作:

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;

如果您有所有可用供应商的列表,您可以:

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;

什么样的数据库响应。您使用的是SQL方言?看起来像MS SQL server是的,这是在MS SQL server 2003上。没有SQL server 2003。选择是2000年、2005年、2008年、2008年和2012年。希望是其中的任何一个,除了2000年,这将真正限制你的选择。很可能是SQL Server 2005。@RBarryYoung你说得对。。对不起:-)这是SQL Server 2008,在服务器2003上,是什么样的数据库响应。您使用的是SQL方言?看起来像MS SQL server是的,这是在MS SQL server 2003上。没有SQL server 2003。选择是2000年、2005年、2008年、2008年和2012年。希望是其中的任何一个,除了2000年,这将真正限制你的选择。很可能是SQL Server 2005。@rbaryyoung你说得对。。对不起:-)这是2003年服务器上的SQL Server 2008。谢谢Gordon,我觉得这是正确的路线。虽然我肯定有一些sytax的错误。查询将执行,但我没有得到任何结果。下面是我正在运行的选择供应商,count(*)from dbo.Worksheet1$r join dbo.Sheet1$s on',“+CompanyName+”,“like%”,“+r.suppliers+”,“%”按供应商分组;抱歉,我不熟悉堆栈,正在尝试找出如何将代码段添加到注释
SELECT r.suppliers,COUNT(*)中,因为r在“,”+CompanyName+“,”LIKE“,”+r.suppliers+”,上加入供应商,%“按r.suppliers分组”
此操作正在运行,但仅在“supplier”是唯一答案的情况下收回响应。逗号周围的语法正确吗?@bmcnally。问题可能是您使用逗号空间作为分隔符,而不仅仅是逗号。尝试将查询中的逗号替换为逗号后跟空格。谢谢Gordon,我觉得这是正确的方法。虽然我肯定有一些sytax的错误。查询将执行,但我没有得到任何结果。下面是我正在运行的选择供应商,count(*)from dbo.Worksheet1$r join dbo.Sheet1$s on',“+CompanyName+”,“like%”,“+r.suppliers+”,“%”按供应商分组;抱歉,我不熟悉堆栈,正在尝试找出如何将代码段添加到注释
SELECT r.suppliers,COUNT(*)中,因为r在“,”+CompanyName+“,”LIKE“,”+r.suppliers+”,上加入供应商,%“按r.suppliers分组”
此操作正在运行,但仅在“supplier”是唯一答案的情况下收回响应。逗号周围的语法正确吗?@bmcnally。问题可能是您使用逗号空间作为分隔符,而不仅仅是逗号。尝试用逗号后跟空格替换查询中的逗号。