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

Откуда:
Сообщений: 4
Сразу прошу прощения за свое отсутствие знаний. Но ситуация такая, что этим вынуждена заниматься я. (запросы к БД не писала лет 5 как минимум)
Исходное: есть БД 2 штуки в каждой есть определенные таблицы
БД1.Таблица1
ID int - идентификатор
Code varchar(3) - код 3 буквы
DateInput datetime - дата ввода
Eanketa int - наличие электронной анкеты
anketa int - наличие анкеты
-- значения в полях eanketa и anketa либо 0 либо 1, соответственно если eanketa = 1, то anketa = 0 и наоборот

БД2.Таблица2
ID int - идентификатор
XML - куча текста типа <anketa Code = "code1" Dateinput = " 20080731" fignya = "фигня полная и в большом количестве"</anketa>


надо получить такой отчет по количеству за дату ввода или диапазон дат

пример отчета
Отчет за 31 июля 2008 года
КОДБД1.Таблица1.eanketa БД1.Таблица1.anketa БД2.Таблица2.anketa
code115510300
code2240200
code33331789
code460978677


запрос по БД1 относительно не сложный, но как написать запрос к БД2 и это соединить вместе - не представляю
в голову пришло только создать временную таблицу и туда вытащить code и dateinput из БД2, но как вытащить и как собрать это вместе не знаю и еще желательно без создания временной таблицы

ПОМОГИТЕ СКРЕСТИТЬ ЕЖА С УЖОМ И ПОЛУЧИТЬ 100 МЕТРОВ КОЛЮЧЕЙ ПРОВОЛОКИ))
9 июл 11, 00:42    [10949287]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2845
KLioubov,

Попробуйте так:
SELECT
    T1.Code,
    T1.Eanketa,
    T1.anketa,
    T2.anketa
FROM БД1.dbo.Таблица1 AS T1 INNER JOIN БД2.Таблица2 AS T2 ON
    T1.ID = T2.ID

KLioubov
значения в полях eanketa и anketa либо 0 либо 1, соответственно если eanketa = 1, то anketa = 0 и наоборот

Вот это я не совсем понял. Если это так, то тогда почему в Вашей таблице странные числа "155", "24", "333" и т.д.? Если в этом поле только 0 или 1, то откуда берутся "другие" цифры?

KLioubov
надо получить такой отчет по количеству за дату ввода или диапазон дат

Если Вы имели ввиду фильтр данных, то к вышеуказанному запросу следует добавить фильтр что-то вроде этого:
DECLARE @Start Datetime, @End Datetime;
SELECT @Start = '20110101', @End = '20110701'
SELECT
    T1.Code,
    T1.Eanketa,
    T1.anketa,
    T2.anketa
FROM БД1.dbo.Таблица1 AS T1 INNER JOIN БД2.Таблица2 AS T2 ON
    T1.ID = T2.ID
WHERE T1.DateInput BETWEEN @Start AND @End;

Или я не понял суть запроса?
9 июл 11, 09:41    [10949803]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
KLioubov
Member

Откуда:
Сообщений: 4
я наверное не правильно выразилась - надо посчитать количество ДБ1.Таблица1.eanketa, БД1.Таблица1.anketa и БД2.Таблица1.xml
в зависимости от CODE
дата и код во второй таблице находятся в поле, содержащем xml данные
9 июл 11, 11:50    [10949955]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
Антон Штерн
Member

Откуда:
Сообщений: 4
Попробуйте привести вторую таблицу к реляционному виду таким запросом:

declare @doc varchar(max),
@xml xml


SELECT @doc='<root>'
SELECT @doc=@doc+БД2.dbo.Таблица2.XML FROM БД2.dbo.Таблица2
SELECT @doc=@doc+'</root>'

SELECT @xml= @doc	
	
SELECT 
a.b.value('./@Code', 'varchar(3)') Code,
a.b.value('./@Dateinput[1]', 'varchar(8)') Dateinput,
a.b.value('./@fignya[1]', 'varchar(max)') fignya
FROM   @xml.nodes('/root/anketa') a(b)

Дальше связывайте полученный результат с первой таблицей по CODE.
9 июл 11, 13:25    [10950097]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
KLioubov
Member

Откуда:
Сообщений: 4
Антон Штерн,
а без создания временной таблице нельзя?
9 июл 11, 15:07    [10950262]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Примерно так:
;with t2
(
 select
  x.a.value('(@Code)[1]', 'varchar(30)') as Code
 from
  БД2.dbo.Таблица2 t cross apply
  t.[xml].nodes('anketa') as x(a)
) 
select
 coalesce(t1.Code, t2.Code),
 count(nullif(t1.Eanketa, 0)),
 count(nullif(t1.anketa, 0)),
 count(t2.Code)
from
 БД1.dbo.Таблица1 t1 full join
 t2 on t2.Code = t1.Code
group by
 t1.Code
Не проверял, т.к. ни схем таблиц в нормальном виде, ни тестовых данных предоставлено не было.
9 июл 11, 16:13    [10950364]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
KLioubov
Member

Откуда:
Сообщений: 4
Спасибо! в понедельник проверю
10 июл 11, 00:27    [10951646]     Ответить | Цитировать Сообщить модератору
 Re: запрос к 2-м базам  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Поправочка:
;with t2 as
(
 select
  x.a.value('(@Code)[1]', 'varchar(30)') as Code
 from
  БД2.dbo.Таблица2 t cross apply
  t.[xml].nodes('anketa') as x(a)
) 
select
 coalesce(t1.Code, t2.Code),
 count(nullif(t1.Eanketa, 0)),
 count(nullif(t1.anketa, 0)),
 count(t2.Code)
from
 БД1.dbo.Таблица1 t1 full join
 t2 on t2.Code = t1.Code
group by
 t1.Code
10 июл 11, 13:05    [10952187]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить