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

Откуда:
Сообщений: 116
Добрый день! Только начинаю изучат T-SQL, до этого работал в ACCESS. Требуется помощь. Есть 3 таблицы:
ТАБ_1 : Id1, Кол1, Дата1
ТАБ_2 : Id2, Кол2, Дата2
ТАБ_3 : Дата3
И параметр отбора для Id - @N

В аксе было так:

Запрос1:
SELECT      Id1, SUM(Кол1) as SM1, Дата1
FROM          ТАБ_1
WHERE      (Id1 = @N)
GROUP BY  Дата1

Запрос2:
SELECT      Id2, SUM(Кол2) as SM2, Дата2
FROM          ТАБ_2
WHERE (Id2 = @N)
GROUP BY  Дата2

Запрос3:
SELECT ТАБ_3. Дата3, Запрос1. SM1, Запрос2. SM2
FROM (Запрос1 RIGHT JOIN ТАБ_3 ON Запрос1. Дата1= ТАБ_3. Дата3) LEFT JOIN Запрос2 ON ТАБ_3. Дата3= Запрос2. Дата2


Ну и далее – прошу помощи. Как я понимаю возможно 3 варианта:

1 вариант:
По аналогии с аксом – 3 хранимых процедуры – тут более-менее понятно, но как-то не очень – придётся из 3-ей передавать параметр @N в две первые – тоже не совсем ещё понятно как.

2 вариант:
Одна ХП. Два первых запроса – как временные таблицы. Попробую разобраться сам, но если кинете набросок – буду благодарен .

3 вариант:
Все впихнуть в один запрос – вот тут я вообще плыву – опыта ещё нет, не знаю с какого бока взяться.


Как резюме – какой вариант предпочтительней?
20 июн 13, 11:32    [14458616]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
shefus
Как резюме – какой вариант предпочтительней?

А что вообще надо получить то ?
20 июн 13, 11:39    [14458656]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Если вы знаете что надо получить и ваш запрос3 правильный попробуйте cte
;with cte1 as(
запрос 1
)
,cte2 as(
запрос 2
)
SELECT ТАБ_3. Дата3, cte1. SM1, cte2. SM2
FROM cte1 
RIGHT JOIN ТАБ_3 ON cte1. Дата1= ТАБ_3. Дата3 
LEFT JOIN cte2 ON ТАБ_3. Дата3= cte2. Дата2
20 июн 13, 11:45    [14458720]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
Требуется получить:

Все записи по Дата3 из таб3 и суммы кол из Таб1 и Таб2 которые соответствуют Дата3(по Дата1 и Дата2) только по позициям Id=@N

Или так - табл1-продажа, табл2-приход, Id -товар, Дата - дата :) Таб3 - таблица периодов. Необходимо получить сумму пришедшего и проданого товара отобранного по Id по периодам Дата в Таб3
20 июн 13, 11:58    [14458808]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
shefus
Требуется получить:

Все записи по Дата3 из таб3 и суммы кол из Таб1 и Таб2 которые соответствуют Дата3(по Дата1 и Дата2) только по позициям Id=@N

https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.4 и п.6
20 июн 13, 12:00    [14458829]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
Мистер Хенки
Если вы знаете что надо получить и ваш запрос3 правильный попробуйте cte
;with cte1 as(
запрос 1
)
,cte2 as(
запрос 2
)
SELECT ТАБ_3. Дата3, cte1. SM1, cte2. SM2
FROM cte1 
RIGHT JOIN ТАБ_3 ON cte1. Дата1= ТАБ_3. Дата3 
LEFT JOIN cte2 ON ТАБ_3. Дата3= cte2. Дата2


Здесь вместо Запрос1 и Запрос2 - вставляю свои запросы в виде SQL инструкции или это имена сохраннёных запросов?
20 июн 13, 12:01    [14458834]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
shefus
Мистер Хенки
Если вы знаете что надо получить и ваш запрос3 правильный попробуйте cte
;with cte1 as(
запрос 1
)
,cte2 as(
запрос 2
)
SELECT ТАБ_3. Дата3, cte1. SM1, cte2. SM2
FROM cte1 
RIGHT JOIN ТАБ_3 ON cte1. Дата1= ТАБ_3. Дата3 
LEFT JOIN cte2 ON ТАБ_3. Дата3= cte2. Дата2


Здесь вместо Запрос1 и Запрос2 - вставляю свои запросы в виде SQL инструкции или это имена сохраннёных запросов?

это ваши запросы.
20 июн 13, 12:03    [14458850]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

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

ТАБ1
ID | Кол | Дата |
1 | 2 | 16.02 |
1 | 2 | 16.02 |
1 | 2 | 16.02 |
1 | 2 | 16.02 |
20 июн 13, 12:08    [14458898]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
Упс ... улетело не доделанное:

ТАБ1
ID|Кол| Дата |
1 | 12 | 16.02 |
1 | 10 | 16.02 |
2 | 20 | 16.02 |
3 | 21 | 16.02 |
1 | 21 | 17.02 |

ТАБ2
ID|Кол| Дата |
1 | 18 | 16.02 |
5 | 10 | 16.02 |
2 | 20 | 16.02 |
3 | 21 | 16.02 |
1 | 25 | 18.02 |
1 | 20 | 18.02 |


ТАБ3
Дата |
16.02 |
17.02 |
18.02 |
19.02 |


Результат при @N=1:
ТАБ1 (поле ID - для наглядности)
Дата |ID|СумТаб1|СумТаб1|
16.02 | 1 | 22 | 18 |
17.02 | 1 | 21 | Null |
18.02 | 1 | Null | 45 |
19.02 | 1 | Null | Null |
20 июн 13, 12:19    [14458996]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
PS MS SQL 2005
20 июн 13, 12:20    [14459015]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * 
from (
SELECT      Id1, SUM(Кол1) as SM1, Дата1
FROM          ТАБ_1
WHERE      (Id1 = @N)
GROUP BY  Дата1
) a
full outer join
(SELECT      Id2, SUM(Кол2) as SM2, Дата2
FROM          ТАБ_2
WHERE (Id2 = @N)
GROUP BY  Дата2) b on a.id1 = b.id2 and a.Дата1 = b.Дата2
20 июн 13, 12:26    [14459061]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Glory
select * 
from (
SELECT      Id1, SUM(Кол1) as SM1, Дата1
FROM          ТАБ_1
WHERE      (Id1 = @N)
GROUP BY  Дата1
) a
full outer join
(SELECT      Id2, SUM(Кол2) as SM2, Дата2
FROM          ТАБ_2
WHERE (Id2 = @N)
GROUP BY  Дата2) b on a.id1 = b.id2 and a.Дата1 = b.Дата2

?????? дырки в периодах будут...

SELECT ТАБ_3. Дата3, ТАБ_1. SM1, ТАБ_2. SM2
FROM ТАБ_3
LEFT JOIN
(
SELECT Id1, SUM(Кол1) as SM1, Дата1
FROM ТАБ_1
WHERE (Id1 = @N)
GROUP BY Дата1
) ТАБ_1 ON ТАБ_1 . Дата1= ТАБ_3. Дата3
LEFT JOIN
(
SELECT Id2, SUM(Кол2) as SM2, Дата2
FROM ТАБ_2
WHERE (Id2 = @N)
GROUP BY Дата2
) ТАБ_2 ON ТАБ_2. Дата1= ТАБ_3. Дата3
20 июн 13, 12:34    [14459158]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
Мистер Хенки
Если вы знаете что надо получить и ваш запрос3 правильный попробуйте cte
;with cte1 as(
запрос 1
)
,cte2 as(
запрос 2
)
SELECT ТАБ_3. Дата3, cte1. SM1, cte2. SM2
FROM cte1 
RIGHT JOIN ТАБ_3 ON cte1. Дата1= ТАБ_3. Дата3 
LEFT JOIN cte2 ON ТАБ_3. Дата3= cte2. Дата2


Спасибо! Вроде работает отлично. Ещё раз спасибо!
20 июн 13, 12:57    [14459383]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос с группировкой  [new]
shefus
Member

Откуда:
Сообщений: 116
Ivan Durak
Glory
select * 
from (
SELECT      Id1, SUM(Кол1) as SM1, Дата1
FROM          ТАБ_1
WHERE      (Id1 = @N)
GROUP BY  Дата1
) a
full outer join
(SELECT      Id2, SUM(Кол2) as SM2, Дата2
FROM          ТАБ_2
WHERE (Id2 = @N)
GROUP BY  Дата2) b on a.id1 = b.id2 and a.Дата1 = b.Дата2

?????? дырки в периодах будут...

SELECT ТАБ_3. Дата3, ТАБ_1. SM1, ТАБ_2. SM2
FROM ТАБ_3
LEFT JOIN
(
SELECT Id1, SUM(Кол1) as SM1, Дата1
FROM ТАБ_1
WHERE (Id1 = @N)
GROUP BY Дата1
) ТАБ_1 ON ТАБ_1 . Дата1= ТАБ_3. Дата3
LEFT JOIN
(
SELECT Id2, SUM(Кол2) as SM2, Дата2
FROM ТАБ_2
WHERE (Id2 = @N)
GROUP BY Дата2
) ТАБ_2 ON ТАБ_2. Дата1= ТАБ_3. Дата3


Тестану и этот вариант
20 июн 13, 12:59    [14459397]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить