といくつかの統計私はいくつかのクラスに属することができる書類を持っているし、いくつかのトークン(言葉)を含めることができますを決定します。TSQL
create table Tokens (
Id INT not null,
Text NVARCHAR(255) null,
primary key (Id)
)
create table DocumentClassTokens (
Id INT not null,
DocumentFk INT null,
ClassFk INT null,
TokenFk INT null,
primary key (Id)
)
私は(クラス与えられたすべてのトークンのため)これらの統計情報を決定したいと思います:
- A =トークン含むクラスに属する異なるドキュメントの数
- B =トークン含むクラスに属していない別個のドキュメントの数
- C =トークン含まれていない明確な文書の数と種類に属する
- D =トークン含まれていませんし、クラス
に属していない明確な文書の数は、私は、現時点ではこれを使用していますが、それは正しく見えません(私はAとBの計算が正しいと確信しています)。
declare @class int;
select @class = id from dbo.Classes where text = 'bla'
;with A as
(
select
a.text as token,
count(distinct DocumentFk) as A
from dbo.Tokens as a
inner join dbo.DocumentClassTokens as b on a.id = b.TokenFk and b.ClassFk = @class
group by a.text
)
,B as
(
select
a.text as token,
count(distinct DocumentFk) as B
from dbo.Tokens as a
inner join dbo.DocumentClassTokens as b on a.id = b.TokenFk and b.ClassFk != @class
group by a.text
)
,C as
(
select
a.text as token,
count(distinct DocumentFk) as C
from dbo.Tokens as a
inner join dbo.DocumentClassTokens as b on a.id != b.TokenFk and b.ClassFk = @class
group by a.text
)
,D as
(
select
a.text as token,
count(distinct DocumentFk) as D
from dbo.Tokens as a
inner join dbo.DocumentClassTokens as b on a.id != b.TokenFk and b.ClassFk != @class
group by a.text
)
select
case when A is null then 0 else A end as A,
case when B is null then 0 else B end as B,
case when C is null then 0 else C end as C,
case when D is null then 0 else D end as D,
t.Text,
t.id
from dbo.Tokens as t
left outer join A as a on t.text = a.token
left outer join B as b on t.text = b.token
left outer join C as c on t.text = c.token
left outer join D as d on t.text = d.token
order by t.text
フィードバックは非常に高く評価されるでしょう。どうもありがとう!
幸運を祈り、
クリスチャン
PS:
いくつかのテストデータ:
use play;
drop table tokens
create table Tokens
(
Id INT not null,
Text NVARCHAR(255) null,
primary key (Id)
)
insert into Tokens (id, text) values (1,'1')
insert into Tokens (id, text) values (2,'2')
drop table DocumentClassTokens
create table DocumentClassTokens (
Id INT not null,
DocumentFk INT null,
ClassFk INT null,
TokenFk INT null,
primary key (Id)
)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (1,1,1,1)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (2,1,1,2)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (3,2,1,1)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (4,2,2,1)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (5,3,2,1)
insert into DocumentClassTokens (Id,documentfk,ClassFk,TokenFk) values (6,3,2,3)
あなたの説明では、(特定の?)トークンを含む、または含まないドキュメントに属しています。さて、あなたが私たちに提示したスクリプトでは、あなたは間違いなく '@ class'パラメータを宣言しています。したがって、それは確かに比較される*特定のクラスです。あなたの説明に従うと、あなたのスクリプトに '@ token'パラメータが宣言されていなければなりません。あるいは、「トークン*を含んでいますか?」(つまり、トークンを含んでいますか?)実際に何をすべきかを明確にしてください。 –
@ Andriy M返事をありがとう。スクリプトは、4つの列トークンA、B、C、Dを持つテーブルを返す必要があります。クラスに与えられたすべてのトークンの統計を取得したいと思います。 – cs0815