Merhaba Arkadaşlar
MS SQL üzerinde 2 adet tablom yer alıyor bu tablolardan 1 tanesi Master (Alis) diğeri Detail (AlisDetay) seklinde*
Bu tablolar içerisinde gelen faturalar ve içeriğindeki ürünler tutuluyor.
Şimdi geleyim problemin detayına
Amacım gelen faturalar içerisindeki ürünlerin*son geliş tarihine*göre son fiyatını almaya çalışıyorum
Aynı tarih içerisinde aynı ürün için 1 den fazla fatura gelebilmektedir.*
Bu durumda son kayıt edilen ürünün fiyatı geçerli olacaktır.*
Bunu sağlayan AlisDetay tablosundaki IdAlisDetay alanıdır.
NOT
Bu işlemi bir alt fonksiyon yazmadan yapmaya çalışıyorum.
IdUrun ve Fiyat şeklinde olanı aşağıdaki scriptte yer aldığı şekilde*çözümlendi.
Fakat*IdUrun, FaturaTarihi, NetFiyat şeklinde daha pratik bir çözüm yolu varmıdır.
Amacım bu sorguyu bir view yada procedure*haline getirip AlisDetay tablosundaki tüm ürünlerin son alış tarihini ve*son fiyatlarını bir liste halinde elde etmektir.
Şimdiden zaman ayıran arkadaşlara teşekkürler
ÖRNEK Tablolar, Örnek sorgu*ve Veri içerikleri aşağıdaki şekildedir.
Kod:
* *select SONFATID.IdUrun, Dty.NetFiyat
* *from (select TRHLI.IdUrun, max(TUMLISTE.IdAlis) as SONID
* * * * * *from (select AD.IdUrun, max(A.FaturaTarihi) as SONTARIH
* * * * * * * * * *from AlisDetay AD
* * * * * * * * * * * * inner join Alis A on A.IdAlis = AD.IdAlis
* * * * * * * * * group by AD.IdUrun
* * * * * * * * *) as TRHLI
* * * * * * * * *inner join (select AD.IdUrun, A.FaturaTarihi, A.IdAlis
* * * * * * * * * * * * * * * *from AlisDetay AD
* * * * * * * * * * * * * * * * * * inner join Alis A on A.IdAlis = AD.IdAlis) as TUMLISTE on TUMLISTE.IdUrun = TRHLI.IdUrun and TUMLISTE.FaturaTarihi = TRHLI.SONTARIH
* * * * * * * * * * * * * * * group by TRHLI.IdUrun) as SONFATID
* * * * * * * * *inner join AlisDetay Dty on Dty.IdUrun = SONFATID.IdUrun and Dty.IdAlis = SONFATID.SONID
Kod:
USE [TEST]
GO
/****** Object: *Table [dbo].[Alis] * *Script Date: 27.08.2020 17:45:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Alis](
[IdAlis] [int] NOT NULL,
[FaturaTarihi] [datetime] NULL,
CONSTRAINT [PK_Alis] PRIMARY KEY CLUSTERED
(
[IdAlis] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: *Table [dbo].[AlisDetay] * *Script Date: 27.08.2020 17:45:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AlisDetay](
[IdAlisDetay] [int] IDENTITY(1,1) NOT NULL,
[IdAlis] [int] NULL,
[IdUrun] [int] NULL,
[NetFiyat] [decimal](18, 2) NULL,
CONSTRAINT [PK_AlisDetay] PRIMARY KEY CLUSTERED
(
[IdAlisDetay] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (1, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (2, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (3, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (4, CAST(N'2020-08-05T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (5, CAST(N'2020-08-05T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (6, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (7, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (8, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (9, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[AlisDetay] ON
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (1, 1, 1, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (2, 1, 2, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (3, 1, 3, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (4, 2, 1, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (5, 2, 2, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (6, 2, 2, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (7, 3, 1, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (8, 3, 2, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (9, 3, 3, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (10, 4, 1, CAST(10.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (11, 4, 2, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (12, 5, 3, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (13, 6, 1, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (14, 6, 2, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (15, 6, 3, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (16, 7, 2, CAST(8.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (17, 8, 1, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (18, 8, 2, CAST(6.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (19, 9, 1, CAST(3.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (20, 9, 2, CAST(4.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (21, 9, 3, CAST(5.50 AS Decimal(18, 2)))
GO
SET IDENTITY_INSERT [dbo].[AlisDetay] OFF
GO
MS SQL üzerinde 2 adet tablom yer alıyor bu tablolardan 1 tanesi Master (Alis) diğeri Detail (AlisDetay) seklinde*
Bu tablolar içerisinde gelen faturalar ve içeriğindeki ürünler tutuluyor.
Şimdi geleyim problemin detayına
Amacım gelen faturalar içerisindeki ürünlerin*son geliş tarihine*göre son fiyatını almaya çalışıyorum
Aynı tarih içerisinde aynı ürün için 1 den fazla fatura gelebilmektedir.*
Bu durumda son kayıt edilen ürünün fiyatı geçerli olacaktır.*
Bunu sağlayan AlisDetay tablosundaki IdAlisDetay alanıdır.
NOT
Bu işlemi bir alt fonksiyon yazmadan yapmaya çalışıyorum.
IdUrun ve Fiyat şeklinde olanı aşağıdaki scriptte yer aldığı şekilde*çözümlendi.
Fakat*IdUrun, FaturaTarihi, NetFiyat şeklinde daha pratik bir çözüm yolu varmıdır.
Amacım bu sorguyu bir view yada procedure*haline getirip AlisDetay tablosundaki tüm ürünlerin son alış tarihini ve*son fiyatlarını bir liste halinde elde etmektir.
Şimdiden zaman ayıran arkadaşlara teşekkürler
ÖRNEK Tablolar, Örnek sorgu*ve Veri içerikleri aşağıdaki şekildedir.
Kod:
* *select SONFATID.IdUrun, Dty.NetFiyat
* *from (select TRHLI.IdUrun, max(TUMLISTE.IdAlis) as SONID
* * * * * *from (select AD.IdUrun, max(A.FaturaTarihi) as SONTARIH
* * * * * * * * * *from AlisDetay AD
* * * * * * * * * * * * inner join Alis A on A.IdAlis = AD.IdAlis
* * * * * * * * * group by AD.IdUrun
* * * * * * * * *) as TRHLI
* * * * * * * * *inner join (select AD.IdUrun, A.FaturaTarihi, A.IdAlis
* * * * * * * * * * * * * * * *from AlisDetay AD
* * * * * * * * * * * * * * * * * * inner join Alis A on A.IdAlis = AD.IdAlis) as TUMLISTE on TUMLISTE.IdUrun = TRHLI.IdUrun and TUMLISTE.FaturaTarihi = TRHLI.SONTARIH
* * * * * * * * * * * * * * * group by TRHLI.IdUrun) as SONFATID
* * * * * * * * *inner join AlisDetay Dty on Dty.IdUrun = SONFATID.IdUrun and Dty.IdAlis = SONFATID.SONID
Kod:
USE [TEST]
GO
/****** Object: *Table [dbo].[Alis] * *Script Date: 27.08.2020 17:45:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Alis](
[IdAlis] [int] NOT NULL,
[FaturaTarihi] [datetime] NULL,
CONSTRAINT [PK_Alis] PRIMARY KEY CLUSTERED
(
[IdAlis] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: *Table [dbo].[AlisDetay] * *Script Date: 27.08.2020 17:45:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AlisDetay](
[IdAlisDetay] [int] IDENTITY(1,1) NOT NULL,
[IdAlis] [int] NULL,
[IdUrun] [int] NULL,
[NetFiyat] [decimal](18, 2) NULL,
CONSTRAINT [PK_AlisDetay] PRIMARY KEY CLUSTERED
(
[IdAlisDetay] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (1, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (2, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (3, CAST(N'2020-08-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (4, CAST(N'2020-08-05T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (5, CAST(N'2020-08-05T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (6, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (7, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (8, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[Alis] ([IdAlis], [FaturaTarihi]) VALUES (9, CAST(N'2020-08-06T00:00:00.000' AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[AlisDetay] ON
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (1, 1, 1, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (2, 1, 2, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (3, 1, 3, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (4, 2, 1, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (5, 2, 2, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (6, 2, 2, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (7, 3, 1, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (8, 3, 2, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (9, 3, 3, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (10, 4, 1, CAST(10.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (11, 4, 2, CAST(5.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (12, 5, 3, CAST(3.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (13, 6, 1, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (14, 6, 2, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (15, 6, 3, CAST(4.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (16, 7, 2, CAST(8.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (17, 8, 1, CAST(2.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (18, 8, 2, CAST(6.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (19, 9, 1, CAST(3.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (20, 9, 2, CAST(4.50 AS Decimal(18, 2)))
GO
INSERT [dbo].[AlisDetay] ([IdAlisDetay], [IdAlis], [IdUrun], [NetFiyat]) VALUES (21, 9, 3, CAST(5.50 AS Decimal(18, 2)))
GO
SET IDENTITY_INSERT [dbo].[AlisDetay] OFF
GO