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

Откуда:
Сообщений: 2
Доброй ночи.
Задачка небольшая, но голову сломал.
Суть - есть 2 таблицы, основная и дополнительная к ней (раскрывает детально отдельные поля родительской таблицы). Допустим, это таблицы рейсов самолетов и пассажиров на этих рейсах. Они связаны номером рейса. При этом, для некоторых рейсов количество пассажиров указано в родительской таблице, а для некоторых в доп.таблице детально расписана информация по каждому пассажиру рейса.
Нужно прочитать значение из доп.таблицы, если оно больше нуля, то взять его; если равно нулю, то использовать значение из родительской таблицы.
Поля:
1) родительская:
- № рейса
- направление от
- направление до
- число пассажиров
2) дополнительная:
- № рейса
- пассажир
- место пассажира

Все, чего смог добиться - считать количество пассажиров из дополнительной таблицы...

select count([dbo].[opt].[Количество]) as [Колво]
from [dbo].[main]

INNER JOIN [dbo].[opt]

ON pass.[ID]=[dbo].[main].[ID]
Group by [dbo].[opt].[ID]

Основная проблема - не могу понять, как проверить, равно ли нулю число пассажиров из доп.таблицы для текущей строки родительской.
Буду признателен за помощь.
14 фев 17, 01:02    [20209558]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
Добрый Э - Эх
Guest
shtile,

отталкиваемся от основной таблицы, джойним к ней внешним соединением предварительно с агрегированные данные из дополнительной и таблицы деталей (две деривед-таблицы), в селект листе кейсом выбираем либо значение из доп.таблицы, либо из таблицы деталей, если в доп.таблице значение равно 0
14 фев 17, 04:06    [20209602]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
Добрый Э - Эх
Guest
shtile,

как вариант - делать внешний джойн основной таблица на дополнительную, а в детали ходить коррелированным подзапросом в селект-листе по кейсу, если в допе нет удовлетворяющих условию данных.
14 фев 17, 04:09    [20209603]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
buven
Member

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

Не вот это? Коль вы версию не указываете...

with Header (Flight,Departure,Arrival,PassQty) as 
(
select 'Flight1','Moscow', 'St.Petersbutg', 45
union all
select 'Flight2','Moscow', 'St.Petersbutg', null
),
Detail (Flight,Passenger,Seat) as (
select 'Flight2','Pas1','E1'
union all
select 'Flight2','Pas2','D1'
union all
select 'Flight2','Pas3','C1'
)
select distinct t.Flight,Departure,Arrival,coalesce(PassQty,count(Seat) over (partition by t1.Flight)) 
from Header t left join Detail t1 on t.Flight=t1.Flight
14 фев 17, 10:12    [20209894]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
buven
Member

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

Точнее так.

with Header (Flight,Departure,Arrival,PassQty) as 
(
select 'Flight1','Moscow', 'St.Petersbutg', 45
union all
select 'Flight2','Moscow', 'St.Petersbutg', 2
),
Detail (Flight,Passenger,Seat) as (
select 'Flight2','Pas1','E1'
union all
select 'Flight2','Pas2','D1'
union all
select 'Flight2','Pas3','C1'
)
select distinct 
	t.Flight,
	Departure,
	Arrival,
	--coalesce(PassQty,count(Seat) over (partition by t1.Flight)),
	case when count(Seat) over (partition by t1.Flight)>0 then count(Seat) over (partition by t1.Flight) else PassQty end
from Header t left join Detail t1 on t.Flight=t1.Flight
14 фев 17, 10:19    [20209906]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
select
 a.[№ рейса], isnull(count(b.[№ рейса]), a.[число пассажиров]) as [Колво]
from
 [родительская] a left join
 [дополнительная] b on b.[№ рейса] = a.[№ рейса]
group by
 a.[№ рейса], a.[число пассажиров];
14 фев 17, 10:47    [20209957]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
invm
select
 a.[№ рейса], isnull(count(b.[№ рейса]), a.[число пассажиров]) as [Колво]
from
 [родительская] a left join
 [дополнительная] b on b.[№ рейса] = a.[№ рейса]
group by
 a.[№ рейса], a.[число пассажиров];
А при каких условиях count(b.[№ рейса]) может выдать NULL?
14 фев 17, 10:57    [20209993]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
Pro100Andrey
Member

Откуда:
Сообщений: 5
shtile,
SELECT CASE 
WHEN T2.CountPass>0
(Select ID, Count(*) As CountPass FROM [dbo].[opt] ORDER BY ID) AS T2
 
14 фев 17, 10:58    [20209997]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Pro100Andrey
shtile,
SELECT CASE 
WHEN T2.CountPass>0
(Select ID, Count(*) As CountPass FROM [dbo].[opt] ORDER BY ID) AS T2
 

что-то странное... очень
14 фев 17, 11:03    [20210022]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
Pro100Andrey
Member

Откуда:
Сообщений: 5
Pro100Andrey,
ИМХО. Как то так?
SELECT CASE 
            WHEN T2.CountPass>0
             THEN T2.CountPass
             ELSE T1. CountPass
FROM  [dbo].[main] AS T1
LEFT JOIN 
(Select ID, Count(*) As CountPass FROM [dbo].[opt] ORDER BY ID) AS T2 ON T2.ID=T1.ID
14 фев 17, 11:05    [20210030]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
Pro100Andrey
Member

Откуда:
Сообщений: 5
TaPaK
Pro100Andrey
shtile,
SELECT CASE 
WHEN T2.CountPass>0
(Select ID, Count(*) As CountPass FROM [dbo].[opt] ORDER BY ID) AS T2
 

что-то странное... очень

Не дописал. Автоматом на публикацию отправил
14 фев 17, 11:06    [20210033]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
iap
А при каких условиях count(b.[№ рейса]) может выдать NULL?
Угу. Не дописал впопыхах.
select
 a.[№ рейса], isnull(nullif(count(b.[№ рейса], 0)), a.[число пассажиров]) as [Колво]
from
 [родительская] a left join
 [дополнительная] b on b.[№ рейса] = a.[№ рейса]
group by
 a.[№ рейса], a.[число пассажиров];
14 фев 17, 11:10    [20210050]     Ответить | Цитировать Сообщить модератору
 Re: Чтение значения из связанной таблицы и выбор нужного  [new]
shtile
Member

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

чуть подработал под себя и заработало. Спасибо большое! :)
Осталось только разобраться, как он работает. Но это со временем пойму.
14 фев 17, 12:42    [20210378]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить