0

あるテーブル [responses] にコンマ区切りフィールドがあり、そのコンマ区切りフィールド [suppliers] に存在できるすべてのオプションを含む別のテーブルがあります。

[responses] テーブルの 1 つのレコード列「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] テーブルは手動で作成したもので、何らかの方法でそれらのアイテムをループしてカウントを取得できることを望んでいました。

この結果を最も多く選択されたサプライヤーのソート可能なリストにする方法についてのアイデアはありますか?

ありがとう


私は非常に近づいているように感じますが、現在は「サプライヤー」が選択された唯一の回答であるレコードのみを数えており、コンマ区切りリストの一部であるレコードを集計していないため、コンマに関する構文。

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 に答える