2015-12-02 2 views
0

Таблица @ t1 - это основная таблица, которая должна иметь суммарные значения таблицы @ t2 после импорта.Сравнение суммированных значений с главной таблицей

DECLARE @t1 TABLE (
    typ   int, 
    total  float 
); 

insert into @t1 (typ,total) values(1,30.0) 
insert into @t1 (typ,total) values(2,70.0) 
insert into @t1 (typ,total) values(3,99.9) 

DECLARE @t2 TABLE (
    typ  int, 
    value float 
); 

insert into @t2 (typ,value) values(1, 10.0) 
insert into @t2 (typ,value) values(1, 20.0) 
insert into @t2 (typ,value) values(2, 30.0) 
insert into @t2 (typ,value) values(2, 40.0) 
insert into @t2 (typ,value) values(3, 50.0) 


select 
    t1.typ, 
    t1.total, 
    t2.typ, 
    t2.value, 
    case when total = value then 'TRUE' else 'FALSE' end as Result 
    from @t1 t1 
left join @t2 t2 on t2.typ = t1.typ 

Результаты в:

typ|total|typ|value|Result 
1 |30 |1 |10 |FALSE 
1 |30 |1 |20 |FALSE 
2 |70 |2 |30 |FALSE 
2 |70 |2 |40 |FALSE 
3 |99,9 |3 |50 |FALSE 

Конечно, результат всегда 'FALSE', потому что t2.value еще не подведены.

Моя первая идея заключается в следующем:

select 
    t1.typ, 
    t1.total, 
    -- t2.typ, 

    (select sum(t2.value) 
    from @t2 t2 
    where t1.typ = t2.typ 
    group by typ) as Summed, 

    case when total = (select sum(t2.value) 
             from @t2 t2 
             where t1.typ = t2.typ 
             group by typ) then 'TRUE' else 'FALSE' end as Result 
    from @t1 t1 
    left join @t2 t2 on t2.typ = t1.typ 

, но я получаю это

typ|total|Summed|Result 
1 |30 |30 |TRUE 
1 |30 |30 |TRUE 
2 |70 |70 |TRUE 
2 |70 |70 |TRUE 
3 |99,9 |50 |FALSE 

Правильный результат должен выглядеть так:

typ|total|Summed|Result 
1 |30 |30 |TRUE 
2 |70 |70 |TRUE 
3 |99,9 |50 |FALSE 

Я был бы рад, чтобы получить ответьте на этот вопрос.

ответ

0

Это обычно будет сделано с left join:

select t1.typ, t1.total, t2.typ, t2.sumvalue, 
     (case when t1.total = t2.sumvalue then 'TRUE' else 'FALSE' end) as Result 
from @t1 t1 left join 
    (select typ, sum(t2.value) as sumvalue 
     from @t2 t2 
     group by typ 
    ) t2 
    on t2.typ = t1.typ; 

outer apply все в порядке, но это использует стандартный SQL ,

+0

Ваше решение, которое я использовал в конце. Спасибо! –

1

Вы можете использовать OUTER APPLY для этого:

SELECT t1.typ, t1.total, x.Summed, 
     CASE 
      WHEN x.Summed = t1.total THEN 'TRUE' 
      ELSE 'FALSE' 
     END   
FROM @t1 AS t1 
OUTER APPLY (
    SELECT SUM(value) AS Summed 
    FROM @t2 AS t2 
    WHERE t1.typ = t2.typ) AS x 
+0

Прохладный, он работает! спасибо, Гиоргос! –

1

Перемещайте случай заявление внешнего запрос производного запроса таблицы:

select typ, total, 
    case when total = Summed then 'TRUE' else 'FALSE' end as Result 
from ( 
    select t1.typ, 
     t1.total, 
     (select sum(t2.value) 
     from @t2 t2 
     where t1.typ = t2.typ 
     group by typ) as Summed  
    from @t1 t1 
) t 
+0

Это решение тоже полезно. Спасибо Грант N! –

Смежные вопросы