9 Temmuz 2018 Pazartesi

SQL Server - Satırları Birleştirme

Merhaba, 
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 STOKADLARID.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_CARIADIB.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

SQL Server - Satırları Birleştirme

Merhaba,  Bu yazımda sql server'da birden çok satırı birleştirip tek satır yapmayı anlatacağım. Senaryomuz şu şekilde olsun mesela; bir...