Gün Bazlı Dinamik Kolon Oluşturarak Rapor Almak | MsSql

Merhaba, satışların olduğu bir tablodan gün bazlı rapor oluşturmam gerekti. Yalnız günler satırlarda değil de, kolonlarda olacaktı.

Daha evvelden böyle bir sorgu yazmadığım için biraz araştırdım ve çözüm buldum.

İhtiyacı olanlar için buraya bırakıyorum:

DECLARE @selectKolonlar AS VARCHAR(MAX) = '',
@kolonlar AS VARCHAR(MAX) = '',
@sorgu AS NVARCHAR(MAX) = '',
@firmaKodu VARCHAR(2) = '01',
@baslangicTarihi DATE = '2021-01-01',
@bitisTarihi DATE = '2021-12-31';

WHILE (@baslangicTarihi <= @bitisTarihi) BEGIN
SET @selectKolonlar = @selectKolonlar + 'ISNULL(' + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120)) + ', 0) AS ' + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120)) + ', ';
SET @kolonlar = @kolonlar + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120)) + ', ';
SET @baslangicTarihi = DATEADD(DAY, 1, @baslangicTarihi);
END;
SET @selectKolonlar = @selectKolonlar + 'ISNULL(' + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120)) + ', 0) AS ' + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120));
SET @kolonlar = @kolonlar + QUOTENAME(CONVERT(VARCHAR(10), @baslangicTarihi, 120));

SET @sorgu = N'SELECT MusteriNo, MusteriAdi, MalzemeNo, ' + @selectKolonlar + ' FROM
(
SELECT r.MalzemeNo
, r.MusteriNo
, r.MusteriAdi
, CAST(ISNULL(r.ToplamMiktar, 0) AS INT) AS SatisAdet
, CONVERT(VARCHAR(10), r.BelgeTarihi, 120) AS BelgeTarihi
FROM SatisRapor r
WHERE r.FirmaKodu = ''' + @firmaKodu + '''
AND r.BelgeTarihi BETWEEN ''2021-08-01'' AND ''2021-12-31''
) x
pivot
(
SUM(SatisAdet)
for [BelgeTarihi] in (' + @kolonlar + ')
) p ';
EXEC sp_executesql @sorgu;

Selamlar.

Leave a Reply

Your email address will not be published.