Bu yazımda sql server'da birden çok satırı birleştirip tek satır yapmayı anlatacağım. Senaryomuz şu şekilde olsun mesela; bir faturamız var ve bunun detayları mevcut. Başlık ve detaylar ayrı tablolarda tutuluyor. Biz şimdi kdv oranlarına göre detaydaki stok adlarını tek bir satır yapacağız. İnternet de arama yaptığınız da değişik yöntemler çıkacaktır karşınıza. XML oluşturarak da yapılabilmektedir ama biz burada fonksiyon ile yapacağız. Bizim KDV beyannameleri gönderimi esnasında başımıza gelen bir olaydı ve bu şekilde çözüme ulaştık.
SQL Server'da işlem yapacağımız veritabanına tıklıyoruz ve Programmability>Functions>Scalar-valued Functions yolunu izliyoruz. Sağ tıklayıp New Scalar-valued Functions diyoruz. Karşımıza aşağıdaki gibi bir sayfa geliyor.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER
ON
GO
CREATE FUNCTION <Scalar_Function_Name,
sysname,
FunctionName>
(
-- Dışarıdan
aldığımız parametreler
<@Param1, sysname, @p1> <Data_Type_For_Param1,
, int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
-- Geri dönüş
değerimiz
DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
-- SQL Sorgumuz
SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>
-- Dönüş değişkenlerimiz.
RETURN <@ResultVar, sysname, @Result>
END
GO
Bahsettiğimiz senaryomuzun kodları aşağıdaki gibidir. (örnek olması maksatıyla)
USE [VERITABANI_ISMI]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER
ON
GO
/****** GetDetay bizim fonksiyonumuzun adıdır. ******/
ALTER FUNCTION [dbo].[GetDetay]
(
@fid int,
@KDV int
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE
@detaylar Nvarchar(MAX)
SELECT
@detaylar = COALESCE(@detaylar + ', ', '') + ISNULL(D.FATURADETAY_STOKADI,'')
FROM
VT_FATURADETAY D WHERE D.FATURADETAY_FISID=@fid AND D.FATURADETAY_KDV=@KDV
RETURN
@detaylar
END
Daha sonra ise sağ tıklayıp Execute diyoruz. Böylelikle fonksiyonumuz kaydetilmiş oluyor. Siz buradaki SQL sorgusunu istediğiniz gibi geliştirebilirsiniz. Group By, Order By, Sum(), Avg() vs. vs. vs.
Şimdi ise gelelim bu fonksiyonu nasıl kullanacağız. Sql Management Studio üzerinden erişmek istediğiniz de ilk başta fonksiyonu tanımayacaktır. Management Studio'yu yeniden başlatırsanız düzelecektir. Örnek olması amacıyla çok basit bir sorgu yazdım. Bu faturanın normalde 5 adet detayı vardır.
SELECT B.FATURABASLIK_CARINO
AS CARINO, B.FATURABASLIK_CARIADI AS
CARIADI,
dbo.GetDetay(B.FATURABASLIK_FISID,
D.FATURADETAY_KDV)
AS STOKADLARI, D.FATURADETAY_KDV AS KDV,
SUM(D.FATURADETAY_MIKTAR) AS TOP_MIKTAR, SUM(D.FATURADETAY_TUTAR) AS TUTAR
FROM VT_FATURABASLIK B INNER
JOIN VT_FATURADETAY D
ON B.FATURABASLIK_SIRKETID=D.FATURADETAY_SIRKETID
AND B.FATURABASLIK_FISID=D.FATURADETAY_FISID
WHERE B.FATURABASLIK_SIRKETID=11 AND B.FATURABASLIK_FISID=1101055
GROUP BY B.FATURABASLIK_CARINO,
B.FATURABASLIK_CARIADI, B.FATURABASLIK_FISID,
D.FATURADETAY_KDV
Ama bu fonksiyonumuz ile tek satırda tüm stokları kdv'lerine göre gruplu toplamları ile birlikte görebilmekteyiz.
Herkese İyi Çalışmalar.
Hiç yorum yok:
Yorum Gönder