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

Откуда: Москва
Сообщений: 606
Есть таблица приход.
Дата приходаШтрихКодКол-воСтоимость
1.01.2011ААА1100
5.02.2011ААА1110
23.03.2011ААА1140


Т.е. Изделие ААА пришло на склад 1.01.2011 в кол-ве 1 штука, и т.д..

Есть таблица продажи:
Дата продажиШтрихКодКол-воСтоимость
1.02.2011ААА1150
6.03.2011ААА1190


Изделие ААА продали клиенту со склада 1.02.2011 в кол-ве 1 штука и т.д.

Дата это динамическая величина. Эти даты задает пользователь.
Допустим пользователь задал период продаж с 1.3.2011 по 20.3.2011
Нам на выходе нужно получить
ШтрихКодДата приходаДата продажиКол-воСтоимость приходаСтоимость продажи
ААА5.02.20116.03.20111110190


SELECT
FROM #Продажи as o
INNER JOIN (SELECT * FROM #Приход) As p on p.ШтрихКод=o.ШтрихКод And p.[Дата прихода]<o.[Дата продажи]
WHERE o.[Дата продажи]>'2011/3/1' and  o.[Дата продажи]<'2011/3/21'

Как мне сделать чтобы он брал последний приход при таком условии p.[Дата прихода]<o.[Дата продажи], а не 2 прихода. Этому условию удовлетворяют два условия, пытался делать ранжированием, что-то не выходит. Вот думаю рекурсия.
18 янв 12, 17:02    [11927446]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
select top 1 with ties *
from income i join outcome o on i.code = o.code
where i.incomedate < o.outcomedate and (o.outcomedate > '20110301' and o.outcomedate < '20110321')
order by ROW_NUMBER() over (partition by i.code order by i.incomedate desc)

??
18 янв 12, 17:35    [11927854]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
minya13_85
пытался делать ранжированием, что-то не выходит

что именно не выходит?
1. Либо через ранжирование с сортировкой по дате и взятием 1 записи
2. Либо OUTER APPLY c TOP 1 по дате.
3. Либо подготовить тестовые данные, ждать и надеяться))).
18 янв 12, 17:38    [11927880]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Baddy
select top 1 with ties *
from income i join outcome o on i.code = o.code
where i.incomedate < o.outcomedate and (o.outcomedate > '20110301' and o.outcomedate < '20110321')
order by ROW_NUMBER() over (partition by i.code order by i.incomedate desc)



Я не понял почему Top1 ? штрихкодов может много..по-мимо AAA,может и ВВВ, ССС и т.д..на выходе мы должны получить таблицу.
А если пользователь задаст период с 1.1.2011 по 31.3.2011..На выходе должно получиться 2 строки, но с соответствующим приходом
18 янв 12, 17:46    [11927969]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
minya13_85
Member

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

use tempdb
go
create table dbo.Income ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.Income VALUES(N'2011/1/1', N'AAA', 1, 100)
INSERT dbo.Income VALUES(N'2011/2/5', N'AAA', 1, 110)
INSERT dbo.Income VALUES(N'2011/3/23', N'AAA', 1, 140)

create table dbo.OutCome ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.OutCome VALUES(N'2011/2/1', N'AAA', 1, 150)
INSERT dbo.OutCome VALUES(N'2011/3/6', N'AAA', 1, 160)
INSERT dbo.OutCome VALUES(N'2011/3/30', N'AAA', 1, 190)

select *
from dbo.Income t1

select *
from dbo.OutCome t1

select *
from income i join outcome o on i.code = o.code
where i.date < o.date and (o.date > '2011/1/1' and o.date < '2011/3/31')
order by ROW_NUMBER() over (partition by i.code order by i.date desc)

drop table income
drop table outcome
18 янв 12, 17:58    [11928075]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
minya13_85
Baddy,

use tempdb
go
create table dbo.Income ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.Income VALUES(N'2011/1/1', N'AAA', 1, 100)
INSERT dbo.Income VALUES(N'2011/2/5', N'AAA', 1, 110)
INSERT dbo.Income VALUES(N'2011/3/23', N'AAA', 1, 140)

create table dbo.OutCome ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.OutCome VALUES(N'2011/2/1', N'AAA', 1, 150)
INSERT dbo.OutCome VALUES(N'2011/3/6', N'AAA', 1, 160)
INSERT dbo.OutCome VALUES(N'2011/3/30', N'AAA', 1, 190)

select *
from dbo.Income t1

select *
from dbo.OutCome t1

select *
from income i join outcome o on i.code = o.code
where i.date < o.date and (o.date > '2011/1/1' and o.date < '2011/3/31')
order by ROW_NUMBER() over (partition by i.code order by i.date desc)

drop table income
drop table outcome

чё-то за флудил...не срабатывает такой ход
kDnZP
что именно не выходит?
1. Либо через ранжирование с сортировкой по дате и взятием 1 записи
2. Либо OUTER APPLY c TOP 1 по дате.
3. Либо подготовить тестовые данные, ждать и надеяться))).

и куда ранг проставить??
18 янв 12, 18:00    [11928093]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
minya13_85,

и что нужно получить в итоги при таких данных?
18 янв 12, 18:20    [11928234]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Baddy
minya13_85,

и что нужно получить в итоги при таких данных?


Если задать период продаж с 1.3.2011 по 31.3.2011 и опираться на эти таблицы:
use tempdb
go
create table dbo.Income ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.Income VALUES(N'2011/1/1', N'AAA', 1, 100)
INSERT dbo.Income VALUES(N'2011/2/5', N'AAA', 1, 110)
INSERT dbo.Income VALUES(N'2011/3/23', N'AAA', 1, 140)

create table dbo.OutCome ([Date] datetime, code NVARCHAR(100), sht INT, price float)
go
INSERT dbo.OutCome VALUES(N'2011/2/1', N'AAA', 1, 150)
INSERT dbo.OutCome VALUES(N'2011/3/6', N'AAA', 1, 160)
INSERT dbo.OutCome VALUES(N'2011/3/30', N'AAA', 1, 190)


то получаем:
ШтрихКодДата приходаДата продажиКол-воСт-ть приходаСт-ть продажи
ААА2011/2/52011/3/61110160
ААА2011/3/232011/3/301140190
18 янв 12, 19:53    [11928673]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
minya13_85
Я не понял почему Top1 ? штрихкодов может много..по-мимо AAA,может и ВВВ, ССС и т.д..на выходе мы должны получить таблицу.
А как Вы понимаете слова WITH TIES?
18 янв 12, 20:21    [11928821]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия  [new]
Baddy
Member

Откуда: Харьков
Сообщений: 174
minya13_85,

попробуй так
select top 1 with ties *		
from income i join outcome o on i.code = o.code
where i.date < o.date and (o.date > '20110301' and o.date < '20110331')
order by ROW_NUMBER() over (partition by i.code, o.date order by i.date desc)
18 янв 12, 20:45    [11928920]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить