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

Откуда:
Сообщений: 34
Подскажите суть решения задачи:

Есть две таблицы
CREATE TABLE Поступило(
  [Дата] datetime NULL,
  [Заявок поступило] int NULL
)

CREATE TABLE Закрыто (
  [Дата] datetime NULL,
  [Заявок закрыто] int NULL
)

Обе таблицы заполнены данными. По датам заявки поступают и закрываются неравномерно. То есть - в одной таблице может быть дата, которой нет в другой таблице.

Итог мне нужно слить в одну таблицу:

CREATE TABLE Итог (
  [Дата] datetime NULL,
  [Заявок поступило] int NULL,
  [Заявок закрыто] int NULL
)
Поле дата - уникально, напротив даты стоят Заявки поступившие и Закрытые.
28 июл 11, 17:52    [11041137]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
UNION ALL + GROUP BY
28 июл 11, 17:53    [11041149]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
AlexJS
Member

Откуда:
Сообщений: 34
Glory
UNION ALL + GROUP BY


А чем поможет? Объединение будет в два столбца - дата в дату, заявки в заявки. А что будет там, где на дату есть и зарегистрированные заявки и выполненные?
28 июл 11, 18:00    [11041206]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
AlexJS
Glory
UNION ALL + GROUP BY


А чем поможет? Объединение будет в два столбца - дата в дату, заявки в заявки. А что будет там, где на дату есть и зарегистрированные заявки и выполненные?

Потому что делать UNION ALL надо с умом
select date, postupilo, 0 as zakrtyto
union all
select date, 0 as psotupilo, zakrtyto
28 июл 11, 18:03    [11041233]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31957
AlexJS
Обе таблицы заполнены данными. По датам заявки поступают и закрываются неравномерно
Если в исходных таблицах поле дата тоже уникально, и это именно дата, а не дата-время, то можно использовать full join
28 июл 11, 18:06    [11041273]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
AlexJS
Member

Откуда:
Сообщений: 34
Идея понятна. Не понятно, почему ругается. Выдает Incorrect syntax near the keyword 'union'.

select 
   year(dbo.ITSM_SERVICECALLSREG_created) as Год, 
   month(dbo.ITSM_SERVICECALLSREG_created) as Месяц, 
   DAY(dbo.ITSM_SERVICECALLSREG_created) as День, 
   count(DAY(dbo.ITSM_SERVICECALLSREG_created)) as Поступило, 
   0 as Закрыто
from ITSM_SERVICECALLS  
where dbo.ITSM_SERVICECALLSREG_created > '20090101'
GROUP by  year(dbo.ITSM_SERVICECALLSREG_created), month(dbo.ITSM_SERVICECALLSREG_created), DAY(dbo.ITSM_SERVICECALLSREG_created) 
order by  year(dbo.ITSM_SERVICECALLSREG_created), month(dbo.ITSM_SERVICECALLSREG_created), DAY(dbo.ITSM_SERVICECALLSREG_created)

union ALL

SELECT 
  year(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS Год,
  month(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS Месяц,
  DAY(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS День,
  0 as Поступило,
  count(DAY(REG_MODIFIED)) AS Закрыто
FROM
  dbo.ITSM_SERVICECALLS
  INNER JOIN dbo.REP_CODES ON (dbo.ITSM_SERVICECALLS.SER_STA_OID = dbo.REP_CODES.RCD_OID)
  INNER JOIN dbo.REP_CODES_TEXT ON (dbo.REP_CODES.RCD_OID = dbo.REP_CODES_TEXT.RCT_RCD_OID)
WHERE
  dbo.ITSM_SERVICECALLS.REG_MODIFIED > '20090101' AND 
  (dbo.REP_CODES_TEXT.RCT_NAME = 'Выполнен' OR 
  dbo.REP_CODES_TEXT.RCT_NAME = 'Закрыт')
GROUP BY
  year(dbo.ITSM_SERVICECALLS.REG_MODIFIED),
  month(dbo.ITSM_SERVICECALLS.REG_MODIFIED),
  DAY(dbo.ITSM_SERVICECALLS.REG_MODIFIED)
order by [Год],[Месяц],[День]
29 июл 11, 09:51    [11043162]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlexJS,

ORDER BY может быть один в конце запроса.
А не у каждого SELECTа UNIONа.
29 июл 11, 09:55    [11043185]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
AlexJS
Member

Откуда:
Сообщений: 34
Запрос выполнен, но результат не тот. 2009 1 11 - два дня в двух строчках. Мне нужен был результат - две цифры в одной строчке.
Год	Месяц	День	Поступило	Закрыто
2009	1	10	0	16
2009	1	11	0	230
2009	1	11	139	0
2009	1	12	85	0
2009	1	12	0	164
2009	1	13	111	0
2009	1	13	0	234
29 июл 11, 10:00    [11043213]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlexJS
Запрос выполнен, но результат не тот. 2009 1 11 - два дня в двух строчках. Мне нужен был результат - две цифры в одной строчке.
Год	Месяц	День	Поступило	Закрыто
2009	1	10	0	16
2009	1	11	0	230
2009	1	11	139	0
2009	1	12	85	0
2009	1	12	0	164
2009	1	13	111	0
2009	1	13	0	234
Выделите UNION в подселект (производную таблицу),
а при выборке из этой производной таблицы группируйте и сортируйте.
29 июл 11, 10:05    [11043241]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
AlexJS
Member

Откуда:
Сообщений: 34
Выделите UNION в подселект (производную таблицу),
а при выборке из этой производной таблицы группируйте и сортируйте.


Спасибо, заработало.

select rezult.Год, rezult.Месяц, rezult.День, sum(rezult.Поступило) as Поступило, sum(rezult.Закрыто) as Закрыто FROM
(
select 
   year(dbo.ITSM_SERVICECALLS.REG_created) as Год, 
   month(dbo.ITSM_SERVICECALLS.REG_created) as Месяц, 
   DAY(dbo.ITSM_SERVICECALLS.REG_created) as День, 
   count(DAY(dbo.ITSM_SERVICECALLS.REG_created)) as Поступило, 
   0 as Закрыто
from ITSM_SERVICECALLS  
where dbo.ITSM_SERVICECALLS.REG_created > '20090101'
GROUP by  year(dbo.ITSM_SERVICECALLS.REG_created), month(dbo.ITSM_SERVICECALLS.REG_created), DAY(dbo.ITSM_SERVICECALLS.REG_created) 

union ALL

SELECT 
  year(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS Год,
  month(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS Месяц,
  DAY(dbo.ITSM_SERVICECALLS.REG_MODIFIED) AS День,
  0 as Поступило,
  count(DAY(REG_MODIFIED)) AS Закрыто
FROM
  dbo.ITSM_SERVICECALLS
  INNER JOIN dbo.REP_CODES ON (dbo.ITSM_SERVICECALLS.SER_STA_OID = dbo.REP_CODES.RCD_OID)
  INNER JOIN dbo.REP_CODES_TEXT ON (dbo.REP_CODES.RCD_OID = dbo.REP_CODES_TEXT.RCT_RCD_OID)
WHERE
  dbo.ITSM_SERVICECALLS.REG_MODIFIED > '20090101' AND 
  (dbo.REP_CODES_TEXT.RCT_NAME = 'Выполнен' OR 
  dbo.REP_CODES_TEXT.RCT_NAME = 'Закрыт')
GROUP BY
  year(dbo.ITSM_SERVICECALLS.REG_MODIFIED),
  month(dbo.ITSM_SERVICECALLS.REG_MODIFIED),
  DAY(dbo.ITSM_SERVICECALLS.REG_MODIFIED)
) as rezult
group by rezult.Год, rezult.Месяц, rezult.День
order by Год, Месяц, День
29 июл 11, 10:09    [11043269]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
AlexJS,

может быть даже убрать GROUP BY из подзапроса, раз снаружи всё равно есть группировка.
Зачем делать одно и то же два раза?
29 июл 11, 10:15    [11043305]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
Teufell
Guest
Может так получится ? ;-)

select
ISNULL(A.[Дата],B.[Дата]) as [Дата],
A.[Заявок поступило],
B.[Заявок закрыто]
from [Поступило] A
full join [Закрыто] B on (A.[Дата] = B.[Дата])
29 июл 11, 12:58    [11044556]     Ответить | Цитировать Сообщить модератору
 Re: объединение двух таблиц  [new]
Teufell
Guest
Можно COALESCE вместо ISNULL воткнуть ;-) (даже правильнее наверное будет)
29 июл 11, 13:04    [11044611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить