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

Откуда:
Сообщений: 261
Снова я... Какая-то у меня нелепая ситуация. Есть два запроса, которые по отдельности работают прекрасно, но когда я пытаюсь слить их в одну таблицу, то выдают неверные числа.
Запрос 1
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE



Запрос 2
 select  s.PROJECTCODE as x_project,
count(sd.sampleid) as sss 
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


Снизу представлена информация, которую они выдают по отдельности и та, которая должна быть, находясь в одном запросе. Пробовала разные методы и подзапросы и два селекта объединить - выдает какую-то фигню, цифры не совпадают, как я их только не объединяла... цифры выдает вообще космические

К сообщению приложен файл. Размер - 29Kb
21 фев 18, 07:42    [21206732]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
katish444,
если пишу вот так, то пропадают некоторые проекты, может не то соединение?

   select  s.PROJECTCODE as x_project,sam.s,
count(sd.sampleid) as sss 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID left join ( select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE)sam on sam.x_project=s.PROJECTCODE
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE,sam.s
21 фев 18, 07:46    [21206740]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,
Выбирай соединения (... Join) в зависимости от полноты данных.
В данном случае данных во втором запросе больше - нужно собирать к нему.
В твоем коде второй запрос "справа" соответственно используй Right Join.
21 фев 18, 07:59    [21206764]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,
select  s.PROJECTCODE as x_project,sam.s,
count(sd.sampleid) as sss 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO right join sample s on s.SAMPLEID=sd.SAMPLEID left join ( select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE)sam on sam.x_project=s.PROJECTCODE
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE,sam.s
21 фев 18, 08:00    [21206765]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly
katish444,
select  s.PROJECTCODE as x_project,sam.s,
count(sd.sampleid) as sss 
from  SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO right join sample s on s.SAMPLEID=sd.SAMPLEID left join ( select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s 
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE)sam on sam.x_project=s.PROJECTCODE
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE,sam.s

Это для конкретного случая? А если у меня в следующий раз будет наоборот - в другой таблице много проектов, а в этой мало?
Когда использую фулл или иннер джойн ничего не меняется
21 фев 18, 08:02    [21206767]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

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

select s.PROJECTCODE as x_project,sam.s,
count(sd.sampleid) as sss
from SAMPLEDESPATCH sd left join DESPATCHSEND ds on sd.DESPATCHNO=ds.DESPATCHNO left join sample s on s.SAMPLEID=sd.SAMPLEID >>>right<<< join ( select dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s
from drillingdetail dd
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
group by PROJECTCODE)sam on sam.x_project=s.PROJECTCODE
where cast([senddate] as date) between '13-feb-2017' and '20-feb-2017'
group by PROJECTCODE,sam.s
21 фев 18, 08:03    [21206768]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

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

Это для конкретного случая? А если у меня в следующий раз будет наоборот - в другой таблице много проектов, а в этой мало?
Когда использую фулл или иннер джойн ничего не меняется
21 фев 18, 08:04    [21206771]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444
Это для конкретного случая? А если у меня в следующий раз будет наоборот - в другой таблице много проектов, а в этой мало?
Когда использую фулл или иннер джойн ничего не меняется


Если может быть больше данных в разных местах - Full Join:

Select isnull(a.x_project,b.x_project),
a.s,
b.sss 
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s 
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 sss 
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
21 фев 18, 08:07    [21206777]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
а заюзать union не?
21 фев 18, 09:28    [21206910]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly,
спасибо. То, что надо, а я не правильно использовала фул джоин
21 фев 18, 10:14    [21207027]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
waszkiewicz
а заюзать union не?

Можно и через Union, но Full join, по-моему, правильнее:

Select x_project
sum(s) as s,
sum(sss) as sss
From 
(
 select  dd.PROJECTCODE as x_project,
sum(cast((case when name = 'totaldrilldepth' then value end) as float)) as s,
cast(null as int) as sss
from drillingdetail dd 
where cast([DRILLINGDATE] as date) between '13-feb-2017' and '20-feb-2017'
 group by PROJECTCODE
union all
 select  s.PROJECTCODE as x_project,
null,
count(sd.sampleid) as sss 
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
) a
21 фев 18, 10:39    [21207101]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Забыл
Group by x_project
21 фев 18, 10:40    [21207107]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly
Забыл
Group by x_project


Я пытаюсь использовать фул джоин чтобы связать с третим запросом, но теперь у меня исчезает проект, которого в первых двух нет, а в треттьем он есть и получается таблица снизу. Может тут использовать другой джоин?

 Select isnull(a.x_project,b.x_project)p,
a.GeolLenght,
b.SendSample, c.assay 
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, 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.PROJECTCODE


К сообщению приложен файл. Размер - 15Kb
21 фев 18, 11:45    [21207390]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 761
katish444, я думаю в предыдущем случае стоило бы разобраться почему запрос начинается с
 Select isnull(a.x_project,b.x_project)p,

Вот зачем там isnull написан?
21 фев 18, 12:04    [21207502]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Mr.Fontaine, чтобы они в один столбец записались и не дублировались
21 фев 18, 12:06    [21207513]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Mr.Fontaine
katish444, я думаю в предыдущем случае стоило бы разобраться почему запрос начинается с
 Select isnull(a.x_project,b.x_project)p,

Вот зачем там isnull написан?


без isnull получается так

К сообщению приложен файл. Размер - 18Kb
21 фев 18, 12:12    [21207541]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
katish444,
Замени Isnull() на COALESCE(a.x_project,b.x_project,c.x_project)
21 фев 18, 12:22    [21207579]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
katish444
Member

Откуда:
Сообщений: 261
Kopelly
katish444,
Замени Isnull() на COALESCE(a.x_project,b.x_project,c.x_project)

спасибо, я уже нашла выход через Ж... соединила все три путем дополнительной таблицы)))
21 фев 18, 12:50    [21207706]     Ответить | Цитировать Сообщить модератору
 Re: Объеденить два запроса  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ИМХО, запрос с UNPIVOT нагляднее получается
+ Осторожно! Внутри жесткий хардкор 27+

WITH
s AS (
  SELECT
    [project] = 'KE',
    [value] = 342.5
  UNION ALL
  SELECT
    [project] = 'MA',
    [value] = 165.5
  UNION ALL
  SELECT
    [project] = 'VA',
    [value] = 330.0
),
sss AS (
  SELECT
    [project] = 'KE',
    [value] = 237.0
  UNION ALL
  SELECT
    [project] = 'MA',
    [value] = 268.0
),
xxx AS (
  SELECT
    [project] = 'KE',
    [value] = 369.0
  UNION ALL
  SELECT
    [project] = 'VA',
    [value] = 473.0
),
tbl AS (
  SELECT
    [project],
    [type] = 's',
    [value]
  FROM
    s
  UNION ALL
  SELECT
    [project],
    [type] = 'sss',
    [value]
  FROM
    sss
  UNION ALL
  SELECT
    [project],
    [type] = 'xxx',
    [value]
  FROM
    xxx
)
SELECT
  *
FROM
  tbl
  PIVOT (
    MAX( [value] ) FOR [type] IN ( [s], [sss], [xxx] )
  ) pvt

21 фев 18, 20:24    [21209639]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить