0

だから私の質問:

SELECT Tags, COUNT(Tags) AS Listings
FROM Job
WHERE datepart(year, dateposted)=2013
GROUP BY Tags
ORDER BY Listings DESC

出力:

+----------------------+----------+
|         Tags         | Listings |
+----------------------+----------+
| java c++             |       41 |
| software development |       41 |
| java c++ c#          |       31 |
|                      |       25 |
| sysadmin             |       25 |
| see jd               |       24 |
| java c++ ood         |       23 |
| java                 |       23 |
+----------------------+----------+

私はそれが次のように出てくることを望みます:

+----------------------+----------+
|         Tags         | Listings |
+----------------------+----------+
| java                 |       118|
| c++                  |       95 |
| ood                  |       23 |
| see                  |       24 |
| jd                   |       24 |
| software development |       41 |
| sysadmin             |       25 |
| c#                   |       31 |
+----------------------+----------+

フィールド全体ではなく、フィールド内の個々の単語をカウントするにはどうすればよいですか? タグ列は nvarchar です。

4

3 に答える 3

8

まず、テーブル構造がひどいです。そのようなリストにデータを保存すると、今しようとしているのと同じような頭痛の種になります。

分割関数の問題は、複数単語のタグが何なのかsoftware development、または他の複数単語のタグが何であるかがわからないことです。それは 1 単語ですか、それとも 2 単語ですか?

これを解決する唯一の方法は、タグを使用してテーブルを作成するか、次のような派生テーブルを使用することだと思います。

;with cte (tag) as
(
  select 'java' union all
  select 'c++' union all
  select 'software development' union all
  select 'sysadmin' union all
  select 'ood' union all
  select 'jd' union all
  select 'see' union all
  select 'c#'
)
select c.tag, count(j.tags) listings
from cte c
inner join job j
  on j.tags like '%'+c.tag+'%'
group by c.tag

SQL Fiddle with Demoを参照してください。これを使用すると、結果を得ることができます。

|                  TAG | LISTINGS |
|                 java |        9 |
|                  c++ |       10 |
| software development |        4 |
|             sysadmin |        2 |
|                  ood |        6 |
|                   jd |        3 |
|                  see |        2 |
|                   c# |        1 |

コメントで指摘された上記の問題は、タグがあるかどうかを判断する方法でsoftwareありdevelopment、それらは上記のクエリと一致します。

この問題に対する最善の解決策は、次のような別のテーブルにタグを格納することです。

create table tags
(
  tag_id int,
  tag_name varchar(50)
);

次に、JOIN テーブルを使用してジョブをタグに接続できます。

create table tag_job
(
  job_id int,
  tag_id int
);

これと同様の設定を行うと、データのクエリがはるかに簡単になります。

select t.tag_name,
  count(tj.tag_id) listings
from tags t
inner join tag_job tj
  on t.tag_id = tj.tag_id
group by t.tag_name

See demo

于 2013-08-29T20:51:03.513 に答える
0

おそらく、個々の単語を分割する必要があります。

SQL Server のスプリッターに関する優れたシリーズは次のとおりです: SqlServerCentral.com

ただし、「ソフトウェア開発」を単一のタグとしてどのように区別できるかわかりません。受け入れ可能なタグのリストが他の場所にある場合は、おそらくそれを使用してカウントを実行できます。

利用可能なタグのリストがある場合、分割を必要としないアプローチの 1 つを次に示します。

SQLフィドルの例

別のタグに含まれているタグがある場合、このアプローチには問題がある可能性があります。つまり、「ソフトウェア」と「ソフトウェア開発」

于 2013-08-29T20:28:54.783 に答える
0

これが私の問題を解決した方法です。

SELECT TOP 50 Tags.s Tag, COUNT(Tags.s) AS Listings
FROM Job
CROSS APPLY [dbo].[SplitString](Tags,' ') Tags
WHERE NOT Job.Tags IS NULL and datepart(year,job.datecreated) = 2013
GROUP BY Tags.s
ORDER BY Listings DESC
于 2013-12-04T15:42:48.483 に答える