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

Откуда: Ростов-на-Дону
Сообщений: 312
Привет всем.
Подскажите, нужно осуществить выборку из 2-х таблиц
CREATE TABLE #t1 (ID int, sname nvarchar(2))
INSERT INTO #t1 VALUES (1, 'n1')
INSERT INTO #t1 VALUES (2, 'n2')

CREATE TABLE #t2 (ID int, vkod int, vid int, all_summ float, mes_rash nvarchar(6))
INSERT INTO #t2 VALUES (1, 1,3,10,'200811')
INSERT INTO #t2 VALUES (2, 1,4,30,'200811')
INSERT INTO #t2 VALUES (4, 1,3,20,'200812')
INSERT INTO #t2 VALUES (5, 1,4,40,'200812')
INSERT INTO #t2 VALUES (6, 2,3,15,'200811')
INSERT INTO #t2 VALUES (7, 2,4,35,'200811')
INSERT INTO #t2 VALUES (8, 2,3,25,'200812')
INSERT INTO #t2 VALUES (9, 2,4,45,'200812')
--
select a.*, b.all_summ as sum1, c.all_summ as sum2, mes_rash from #t1 a
inner join #t2 b on b.vkod=a.id
inner join #t2 c on c.vkod=a.id
where b.mes_rash='200812' and b.vid=3 and c.vid=4

drop table #t2
drop table #t1
и получить в результате
id, sname, sum1, sum2, mes_rash
1,     n1,   20,     40,    200812
2,     n2,   25,     45,    200812  
щас же имею
1,     n1,   20,     30,    200812
1,     n1,   20,     40,    200812
2,     n2,   25,     35,    200812  
2,     n2,   25,     45,    200812  
27 авг 09, 12:07    [7585774]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33354
Блог
А принцип получения результата - секрет?
27 авг 09, 12:09    [7585784]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Andrey Pogorelov
Member

Откуда: Ростов-на-Дону
Сообщений: 312
Нужно по полю [vid] собрать информацию, за определенный месяц, в одну строку, в таблице есть записи и с другими кодами в поле [vid]
27 авг 09, 12:12    [7585803]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
select top 1 with ties a.*, b.all_summ as sum1, c.all_summ as sum2, b.mes_rash from #t1 a
inner join #t2 b on b.vkod=a.id
inner join #t2 c on c.vkod=a.id
where b.mes_rash='200812' and b.vid=3 and c.vid=4
order by row_number() over(partition by a.ID order by c.all_summ desc)

ID          sname sum1                   sum2                   mes_rash
----------- ----- ---------------------- ---------------------- --------
1           n1    20                     40                     200812
2           n2    25                     45                     200812

(2 row(s) affected)
27 авг 09, 12:13    [7585814]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Andrey Pogorelov
Member

Откуда: Ростов-на-Дону
Сообщений: 312
Спасибо Паганель, то что нужно!
27 авг 09, 12:16    [7585834]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Taffy
Member

Откуда:
Сообщений: 20498
select a.id, a.sname, 
        MAX(b.all_summ) as sum1, MAX(c.all_summ) as sum2, b.mes_rash 
from #t1 a
       inner join #t2 b on b.vkod=a.id
where b.mes_rash='200812' and b.vid=3 and b.vid=4
group by a.id, a.sname
27 авг 09, 12:16    [7585837]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Taffy,
действительно, перемудрил я что-то
звездочка с толку сбила меня
27 авг 09, 12:17    [7585848]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Andrey Pogorelov
Member

Откуда: Ростов-на-Дону
Сообщений: 312
Тогда наверное все таки так
select a.id, a.sname, 
        MAX(b.all_summ) as sum1, MAX(c.all_summ) as sum2, b.mes_rash
from #t1 a
       inner join #t2 b on b.vkod=a.id
       inner join #t2 c on c.vkod=a.id
where b.mes_rash='200812' and b.vid=3 and c.vid=4
group by a.id, a.sname, b.mes_rash
27 авг 09, 12:28    [7585911]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Andrey Pogorelov


ну тогда уж

select a.id, a.sname, 
        MAX(case when b.vid = 3 then b.all_summ else 0 end) as sum1, 
        MAX(case when b.vid = 4 then b.all_summ else 0 end) as sum2, 
        b.mes_rash
from #t1 a
       inner join #t2 b on b.vkod=a.id
where b.mes_rash='200812' and b.vid in (3,4)
group by a.id, a.sname, b.mes_rash
27 авг 09, 12:32    [7585944]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый select  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select id, sname, [3] as sum1, [4] as sum2, mes_rash from
(
select a.*, b.vid, b.all_summ, mes_rash
from #t1 a
       inner join #t2 b on b.vkod=a.id     
) t        
pivot 
(max(all_summ) for vid in ([3],[4])) p
where mes_rash='200812'
27 авг 09, 12:48    [7586050]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить