Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему происходит дублирование  [new]
katish444
Member

Откуда:
Сообщений: 261
Привет все.
Ребят, подскажите, пожалуйста, по какой причине у меня в таблице могут дублироваться столбцы. Дублирование началось, когда я добавила подзапрос t
Может соединение неверное? Или может еще что не правильно?
Причем дублирование зависит от того, по какой таблице я устанавливаю связь. Если
on  t.x_project=b.x_project
то дублируются строки, которых нет в таблице b, если
on  t.x_project=a.x_project
то дублируется строка, которой нет в 'a'

+
Select pp.PROJECTCODE,pp.DESCRIPTION,
a.GeolLenght,
b.SendSample, c.assay, TakenSample 
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as GeolLenght 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) a
full join (
 select  s.PROJECTCODE as x_project,
count(sd.sampleid) as SendSample 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID 
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) b on a.x_project = b.x_project
full join (
 select  ss.PROJECTCODE as x_project,
count(ts.sampleid) as TakenSample 
from  SAMPLEDETAILS ts  left join sample ss on ss.SAMPLEID=ts.SAMPLEID 
where cast((case when name = 'SampDateTaken' then value end) as date) between '13-feb-2017' and '20-feb-2017'  
 group by PROJECTCODE
) t on  t.x_project=b.x_project

full join
(Select projectcode as x_project, count(sss)assay from (select distinct s.sampleid as sss,PROJECTCODE 
from cORPSAMPLEASSAY c left join sample s on s.SAMPLEID= c.SAMPLEID 
where cast([LOADDATE] as date) between '2017-02-13' and '2017-03-10')abc
group by abc.PROJECTCODE)c on a.x_project=c.x_project
left join PROJECT pp on pp.PROJECTCODE=c.x_project or pp.PROJECTCODE=b.x_project or pp.PROJECTCODE=a.x_project or pp.PROJECTCODE=t.x_project
group by pp.PROJECTCODE,a.GeolLenght,pp.DESCRIPTION,
b.SendSample, c.assay,TakenSample  
order by pp.DESCRIPTION


К сообщению приложен файл. Размер - 30Kb
5 мар 18, 08:22    [21236773]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,
on  t.x_project=isnull(b.x_project,a.x_project)
5 мар 18, 08:34    [21236792]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, спасибо. Кажется сработало
5 мар 18, 08:47    [21236812]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly
katish444,
on  t.x_project=isnull(b.x_project,a.x_project)


Не сработало. Вернее помогло, только для тех конкретных дат, которые были установлены. При изменении не объединяет, дублирует...

+
 Select pp.PROJECTCODE,pp.DESCRIPTION,
a.GeolLenght,
b.SendSample, c.assay, TakenSample 
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as GeolLenght 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) a
full join (
 select  s.PROJECTCODE as x_project,
count(sd.sampleid) as SendSample 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID 
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) b on a.x_project =b.x_project


full join
(Select projectcode as x_project, count(sss)assay from (select distinct s.sampleid as sss,PROJECTCODE 
from cORPSAMPLEASSAY c left join sample s on s.SAMPLEID= c.SAMPLEID 
where cast([LOADDATE] as date) between '2017-02-13' and '2017-03-10')abc
group by abc.PROJECTCODE)c on a.x_project=isnull(b.x_project,c.x_project)
full join (
 select  ss.PROJECTCODE as x_project,
count(ts.sampleid) as TakenSample 
from  SAMPLEDETAILS ts  left join sample ss on ss.SAMPLEID=ts.SAMPLEID 
where cast((case when name = 'SampDateTaken' then value end) as date) between '13-feb-2017' and '20-feb-2017'  
 group by ss.PROJECTCODE
) t on   t.x_project=isnull(b.x_project,c.x_project)
left join PROJECT pp on pp.PROJECTCODE=c.x_project or pp.PROJECTCODE=b.x_project or pp.PROJECTCODE=a.x_project or pp.PROJECTCODE=t.x_project
group by pp.PROJECTCODE,a.GeolLenght,pp.DESCRIPTION,
b.SendSample, c.assay,TakenSample  
order by pp.DESCRIPTION


К сообщению приложен файл. Размер - 40Kb
5 мар 18, 09:33    [21236886]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,

Остальные JOIN'ы тоже надо править:
Select pp.PROJECTCODE,pp.DESCRIPTION,
a.GeolLenght,
b.SendSample, c.assay, TakenSample 
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as GeolLenght 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) a
full join (
 select  s.PROJECTCODE as x_project,
count(sd.sampleid) as SendSample 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID 
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) b on a.x_project =b.x_project


full join
(Select projectcode as x_project, count(sss)assay from (select distinct s.sampleid as sss,PROJECTCODE 
from cORPSAMPLEASSAY c left join sample s on s.SAMPLEID= c.SAMPLEID 
where cast([LOADDATE] as date) between '2017-02-13' and '2017-03-10')abc
group by abc.PROJECTCODE)c on a.x_project=isnull(b.x_project,c.x_project)
full join (
 select  ss.PROJECTCODE as x_project,
count(ts.sampleid) as TakenSample 
from  SAMPLEDETAILS ts  left join sample ss on ss.SAMPLEID=ts.SAMPLEID 
where cast((case when name = 'SampDateTaken' then value end) as date) between '13-feb-2017' and '20-feb-2017'  
 group by ss.PROJECTCODE
) t on   t.x_project=COALESCE(a.x_project,b.x_project,c.x_project)
left join PROJECT pp on pp.PROJECTCODE=c.x_project or pp.PROJECTCODE=b.x_project or pp.PROJECTCODE=a.x_project or pp.PROJECTCODE=COALESCE(a.x_project,b.x_project,c.x_project,t.x_project)
group by pp.PROJECTCODE,a.GeolLenght,pp.DESCRIPTION,
b.SendSample, c.assay,TakenSample  
order by pp.DESCRIPTION
5 мар 18, 09:48    [21236922]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly,

почему то скрипт не позволяет использовать COALESCE в других селектах. Можео только те, которые задействованы выше. То есть в самой нижней таблице можно использовать со всеми, а в таблице с, только с a и b, в таблице b только с a. То есть только с теми, которые находятся выше в скрипте, иначе
Msg 4104, Level 16, State 1, Line 20
The multi-part identifier "t.x_project" could not be bound.
5 мар 18, 11:47    [21237275]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,
Такой ошибки быть не должно...
+
Select pp.PROJECTCODE,pp.DESCRIPTION,
a.GeolLenght,
b.SendSample, c.assay, TakenSample 
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as GeolLenght 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) a
full join (
 select  s.PROJECTCODE as x_project,
count(sd.sampleid) as SendSample 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID 
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
) b on a.x_project =b.x_project
full join
(Select projectcode as x_project, count(sss)assay from (select distinct s.sampleid as sss,PROJECTCODE 
from cORPSAMPLEASSAY c left join sample s on s.SAMPLEID= c.SAMPLEID 
where cast([LOADDATE] as date) between '2017-02-13' and '2017-03-10')abc
group by abc.PROJECTCODE)c on c.x_project=isnull(b.x_project,a.x_project)
full join (
 select  ss.PROJECTCODE as x_project,
count(ts.sampleid) as TakenSample 
from  SAMPLEDETAILS ts  left join sample ss on ss.SAMPLEID=ts.SAMPLEID 
where cast((case when name = 'SampDateTaken' then value end) as date) between '13-feb-2017' and '20-feb-2017'  
 group by ss.PROJECTCODE
) t on   t.x_project=COALESCE(a.x_project,b.x_project,c.x_project)
left join PROJECT pp on pp.PROJECTCODE=COALESCE(a.x_project,b.x_project,c.x_project,t.x_project)
--group by pp.PROJECTCODE,a.GeolLenght,pp.DESCRIPTION,b.SendSample, c.assay,TakenSample  
order by pp.DESCRIPTION
5 мар 18, 12:44    [21237442]     Ответить | Цитировать Сообщить модератору
 Re: Почему происходит дублирование  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly, поняла, спасибо огромное
5 мар 18, 13:10    [21237514]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить