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

Откуда:
Сообщений: 311
Запутался с запросом

Дано:
1. @c.id - PK
2. @t[1..3].c_id - FK на @c.id
3. в @t1 предположительно все данные (новая система)
4. в @t2,@t3 (старая система) - предположительно в сумме теже данные что и в @t1, но данные разделены по [c_id] по разным таблицам

Пытаюсь написать запрос, который выдаст статистику по наличию/отсутствию/кол-во совпадений по каждому @c.id

declare @c table( id int identity, name sysname )

declare @t1 table( c_id int, Key1 int, Key2 int, val int )
declare @t2 table( c_id int, Key1 int, Key2 int, val int )
declare @t3 table( c_id int, Key1 int, Key2 int, val int )

insert into @c(name)
select 'name1' union all
select 'name2' union all
select 'name3' union all
select 'name4' 

insert into @t1
select 1, 1, 1, 1 union all
select 1, 2, 2, 2 union all
select 1, 3, 3, 3 union all
select 2, 1, 1, 1 union all
select 2, 2, 2, 2 union all
select 2, 3, 3, 3 union all
select 3, 1, 1, 1 union all
select 3, 2, 2, 2 union all
select 3, 3, 3, 3 

insert into @t2
select 1, 2, 2, 2 union all
select 4, 8, 8, 8 union all
select 1, 4, 4, 4 

insert into @t3
select 2, 2, 2, 2 union all
select 2, 4, 4, 4 union all
select 3, 2, 2, 2 union all
select 3, 4, 4, 4 

--select * 
select
  c.id
  ,SUM( CASE WHEN coalesce(t1.c_id, t2.c_id, t3.c_id) is NULL then 0 else 1 end ) as [TotalCount]
  ,SUM([Absent_In_t1]) as [Absent_In_t1]
  ,SUM([Absent_In_t2..t3]) as [Absent_In_t2..t3]
  ,SUM([isVal_OK]) as [isVal_OK]

from @c as c
full join @t1 as t1 on
  c.id = t1.c_id
full join @t2 as t2 on
      c.id = t2.c_id
  and t1.Key1 = t2.Key1
  and t1.Key2 = t2.Key2
full join @t3 as t3 on
      c.id = t3.c_id
  and t1.Key1 = t3.Key1
  and t1.Key2 = t3.Key2
cross apply(
  select
    case when t1.c_id is NULL then 1 else 0 end as [Absent_In_t1]
    ,case when coalesce( t2.c_id, t3.c_id) is NULL then 1 else 0 end as [Absent_In_t2..t3]
    ,case when t1.val = coalesce( t2.val, t3.val ) then 1 else 0 end as [isVal_OK]
) as r
--where c.id is not NULL
GROUP BY c.id --WITH ROLLUP
Выдает
idTotalCountAbsent_In_t1Absent_In_t2..t3isVal_OK
NULL4400
13021
23021
33021
40110

Никак не пойму - откуда берется строка с [ID] is NULL ???
10 ноя 11, 12:02    [11573583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

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

а если OUTER APPLY?
10 ноя 11, 12:19    [11573788]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
iap
Greenhorn,

а если OUTER APPLY?

Вместо CROSS APPLY - таже фигня. Да и в остальной выборке циферки кажись не те
10 ноя 11, 12:23    [11573848]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
mike909
Member

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

SELECT 
   c.id
  ,SUM([TotalCount]) as [TotalCount]
  ,SUM([Absent_In_t1]) as [Absent_In_t1]
  ,SUM([Absent_In_t2..t3]) as [Absent_In_t2..t3]
  ,SUM([isVal_OK]) as [isVal_OK]
FROM @c as c 
LEFT OUTER JOIN (
  select
    r.[ID]
    ,SUM( CASE WHEN coalesce(t1.c_id, t2.c_id, t3.c_id) is NULL then 0 else 1 end ) as [TotalCount]
    ,SUM([Absent_In_t1]) as [Absent_In_t1]
    ,SUM([Absent_In_t2..t3]) as [Absent_In_t2..t3]
    ,SUM([isVal_OK]) as [isVal_OK]
  FROM @t1 as t1
  full join @t2 as t2 on
        t1.c_id = t2.c_id
    and t1.Key1 = t2.Key1
    and t1.Key2 = t2.Key2
  full join @t3 as t3 on
        t1.c_id = t3.c_id
    and t1.Key1 = t3.Key1
    and t1.Key2 = t3.Key2
  cross apply(
    select
      COALESCE( t1.c_id, t2.c_id, t3.c_id ) as [ID]
      ,case when t1.c_id is NULL then 1 else 0 end as [Absent_In_t1]
      ,case when coalesce( t2.c_id, t3.c_id) is NULL then 1 else 0 end as [Absent_In_t2..t3]
      ,case when t1.val = coalesce( t2.val, t3.val ) then 1 else 0 end as [isVal_OK]
  ) as r
  GROUP BY [id] 
) as t on
  c.id = t.id
group by c.id WITH ROLLUP
Это ?
10 ноя 11, 12:25    [11573866]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Greenhorn
Member

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

Спасибо, кажись то что нужно - пошел проверять на реальных данных ...
10 ноя 11, 12:30    [11573907]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить