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.

4 Temmuz 2018 Çarşamba

SQL Server Row_Number Komutu ve 2 Tablo Arasında Update İşlemi

Merhabalar,

Bu notumda ROW_NUMBER() komutundan bahsedeceğim ve daha sonrasında ise iki tablo arasında nasıl güncelleme yaparız ondan bahsedeceğim.

Öncelikle kısaca RIGHT komutundan bahsedeceğim. Bildiğiniz üzere RIGHT() ve LEFT() komutu string ifadelerde baştan veya sonra kaç karakter belirtir isek o kadarlık kısmını kesip alıyor. Örnek vermek gerekirse:

SELECT RIGHT('İlyas', 3) as DENEME ===> yas
SELECT LEFT('İlyas', 4) as DENEME ===> İlya

Burada ilk sorguda right komutu ile sonran 3 karakter almak istediğimizi belirtiyoruz. Şimdi gelelim right komutu ile Row_Number komutunu birlikte nasıl kullanacağız. 

SELECT '120.01.' + RIGHT('000' + CONVERT(nvarchar, (ROW_NUMBER() OVER (ORDER BY ACTNAME))), 4) AS YENI_NO
FROM ACT
WHERE ACTNO LIKE '120%'

Buradaki senaryomuz şu şekilde. Şirketde yapmış olduğumuz bir işlemin küçük bir kısmı. Cari kartlarımızdan 120 ile başlayanların listeliyoruz. Bunların başına 120.01. ekliyoruz. Daha sonra ise 3 adet 000 koyuyoruz ve satır numaralarını yazmaya başlıyoruz. İlk başta 9a kadar sorun 0001, 0002, ....., 0009 şeklinde sonrasında ise 00010, 00011,....00099 şeklinde devam ediyor fakat biz sondan 4 haneyi al dediğimiz için 0010,....0099 şeklinde alıyor. Bu işlem 0999,....., 9998 şeklinde devam edip 9999 olduğunda bitiyor. Daha sonra güncelleme yada yeni kayıt ekleme gibi ne tür işlem yapacaksanız ve kayıt sayınıza göre hane sayısını artırıp azaltabilirsiniz yada noktadan sonra kaç karakter istiyorsanız ona göre düzenleyebilirsiniz.

Şimdi ise ikinci konumuza gelelim. Birbiri ile bağlantılı iki tablo arasında güncelleme işlemi yapacaksak kullanmamız gereken kod aşağıdaki gibidir: 

UPDATE T1
SET T1.BIRIM111= T2.BIRIM222
FROM TABLO_1 T1 JOIN TABLO_2 T2
       ON T1.ID = T2.ID

Burada Tablo_1'i güncelliyoruz. Tablo_1 ve Tablo_2'deki kayıtları eşleştiriyoruz ve Tablo_2'deki BIRIM222 sütunundaki bilgiyi Tablo_1'deki BIRIM111 alanına atıyoruz.

Herkese İyi Çalışmalar.

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...