我有可能屬於幾個類別,可以包含幾個標記(字)文件:確定與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`參數,不應該在那裏?還是你的意思是'包含*標記*'(即任何標記?)。請澄清它應該是什麼。 – 2011-02-04 08:28:30
@ Andriy M感謝您的回覆。該腳本應該返回一個包含四列記號A,B,C,D的表格。所以,我想獲得給定類別的所有記號的統計信息。 – cs0815 2011-02-04 08:55:30