Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему происходит дублирование / 8 сообщений из 8, страница 1 из 1
05.03.2018, 08:22
    #39610416
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
Привет все.
Ребят, подскажите, пожалуйста, по какой причине у меня в таблице могут дублироваться столбцы. Дублирование началось, когда я добавила подзапрос t
Может соединение неверное? Или может еще что не правильно?
Причем дублирование зависит от того, по какой таблице я устанавливаю связь. Если
Код: sql
1.
on  t.x_project=b.x_project

то дублируются строки, которых нет в таблице b, если
Код: sql
1.
on  t.x_project=a.x_project

то дублируется строка, которой нет в 'a'

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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

...
Рейтинг: 0 / 0
05.03.2018, 08:34
    #39610418
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
katish444,
Код: sql
1.
on  t.x_project=isnull(b.x_project,a.x_project)
...
Рейтинг: 0 / 0
05.03.2018, 08:47
    #39610421
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
Kopelly, спасибо. Кажется сработало
...
Рейтинг: 0 / 0
05.03.2018, 09:33
    #39610444
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
Kopellykatish444,
Код: sql
1.
on  t.x_project=isnull(b.x_project,a.x_project)



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 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

...
Рейтинг: 0 / 0
05.03.2018, 09:48
    #39610456
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
katish444,

Остальные JOIN'ы тоже надо править:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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
...
Рейтинг: 0 / 0
05.03.2018, 11:47
    #39610543
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
Kopelly,

почему то скрипт не позволяет использовать COALESCE в других селектах. Можео только те, которые задействованы выше. То есть в самой нижней таблице можно использовать со всеми, а в таблице с, только с a и b, в таблице b только с a. То есть только с теми, которые находятся выше в скрипте, иначе
Код: sql
1.
2.
Msg 4104, Level 16, State 1, Line 20
The multi-part identifier "t.x_project" could not be bound.
...
Рейтинг: 0 / 0
05.03.2018, 12:44
    #39610581
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
katish444,
Такой ошибки быть не должно...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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

...
Рейтинг: 0 / 0
05.03.2018, 13:10
    #39610599
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему происходит дублирование
Kopelly, поняла, спасибо огромное
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему происходит дублирование / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]