Delphi Can

Orjinalini görmek için tıklayınız: Tek bir tablodan raporlama ihtiyacı ?
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
Arkadaşlar bir mantığa ihtiyacım var ?  

Aşağıda göreceğiniz gibi bir tablo ve sonra bu tablodaki verilere göre alınan bir rapor örneği hazırladım. İşte sorum da tam olarak burda başlıyor aşağıdaki örnekteki gibi tek bir tabloda tutulan bu kayıtların bir alttaki resimde olduğu gibi yatay - dikey bir rapor alabilmem için bir mantığa ihtiyacım var. 

Bu arada cari sayısı ve ürün sayısı da belli değil  ?

Umarım anlatabilmişimdir.
261YGj.jpg
(02-01-2019, Saat: 02:11)KUNTAY Adlı Kullanıcıdan Alıntı: [ -> ]Arkadaşlar bir mantığa ihtiyacım var ?  

Aşağıda göreceğiniz gibi bir tablo ve sonra bu tablodaki verilere göre alınan bir rapor örneği hazırladım. İşte sorum da tam olarak burda başlıyor aşağıdaki örnekteki gibi tek bir tabloda tutulan bu kayıtların bir alttaki resimde olduğu gibi yatay - dikey bir rapor alabilmem için bir mantığa ihtiyacım var. 

Bu arada cari sayısı ve ürün sayısı da belli değil  ?

Umarım anlatabilmişimdir.
261YGj.jpg
MS SQL Server Kullanıyorsan
Pivot Table Kullanarak olayı çözebilirsin.
Cari Sayısını Önemi yok ama Yatayda dizeceğin columnların sayısının önemi var

Eğer Yatayda kullanacaklarının da sayısını bilmiyorsan

Dynamic pivot diye araman yeterli  Cool
Merhaba
@FiRewaLL Arkadaşın dediği gibi Sqlden Pivot oluşturulabilirsin ama kolonların sabit tanımlanması durumu işi bozuyor
DevExpress 'de cxDBPivotGrid var çok kullanışlı bir araç.
Pivot Table tam olarak aradığım şey miş  @FiRewaLL teşekkür ederim.
(02-01-2019, Saat: 18:14)emrahgs Adlı Kullanıcıdan Alıntı: [ -> ]Merhaba
@FiRewaLL Arkadaşın dediği gibi Sqlden Pivot oluşturulabilirsin ama kolonların sabit tanımlanması durumu işi bozuyor
DevExpress 'de cxDBPivotGrid var çok kullanışlı bir araç.

Dynamic Pivot 'u söylememdeki sebep tam olarak burasıydı.
Eğer i kolonlar sabit değil ve gelecek kolonları bilrmiyosanız dynamic pivot kullanılması gerekir..

(02-01-2019, Saat: 23:38)KUNTAY Adlı Kullanıcıdan Alıntı: [ -> ]Pivot Table tam olarak aradığım şey miş  @FiRewaLL teşekkür ederim.

Ben Teşekkür ederim kardeşim.

Dynamic Pivot Karışık ve biraz da Sıkıntılı bir işlem Smile

Bir Örnek Ekleyeyim Wink

PHP Kod:
DECLARE @cols   AS NVARCHAR(MAX     ,@query AS NVARCHAR(MAX);
SELECT @cols STUFF (
(
SELECT ',' QUOTENAME (col '_' CAST(t.AY AS VARCHAR(20))  )
FROM #STOKLAR t
CROSS APPLY (SELECT 'ORT_ALIS_FIYATI'
 
                  ,ORT_ALIS_FIYATI
            UNION ALL
            SELECT 
'ORTALAMA_SAT_FIYATI'
 
                  ,ORTALAMA_SAT_FIYATI
            UNION ALL
            SELECT 
'ORT_TRANSFER_FIYATI'
 
                  ,ORT_TRANSFER_FIYATI
UNION ALL
            SELECT 
'ORT_MALIYET_FIYATI'
 
                  ,ORT_MALIYET_FIYATIc(colso)
GROUP BY col
        
,T.AY
ORDER BY AY
FOR XML PATH (''), TYPE).value ('.''NVARCHAR(MAX)'),1,1,'' );
SET @query 'SELECT STOK_KODU,STOK_ADI,BR,KOD_1,KOD_2,KOD_3,KOD_4,KOD_5,'
 
          + @cols
           
' from (SELECT STOK_KODU,STOK_ADI,BR,KOD_1,KOD_2,KOD_3,KOD_4,KOD_5, 
col = col + ''_'' + cast(AY as varchar(4)),  value from #STOKLAR t 
cross apply(select ''ORT_ALIS_FIYATI'', ORT_ALIS_FIYATI union all select ''ORTALAMA_SAT_FIYATI'', 
ORTALAMA_SAT_FIYATI union all  SELECT ''ORT_TRANSFER_FIYATI'', ORT_TRANSFER_FIYATI UNION ALL SELECT ''ORT_MALIYET_FIYATI'',
ORT_MALIYET_FIYATI) 
c (col, value) ) x pivot (sum(value) for col in ('
+ @cols ') ) p ';

EXECUTE sp_executesql @query

Yukarıdaki örnekte ORT_ALIS_FIYATI,ORTALAMA_SAT_FIYATI,ORT_TRANSFER_FIYATI,ORT_MALIYET_FIYATI 
kolonlarının yanına ay numaraları gelecektir
Ay numaralarını kullanıcı gönderildiği için tabiki de sayısını bilmiyoruz bu sebeple gelen şube kodu kadar ekleme yapacaktır.
SQL cümlesinin sonucunda
ORT_ALIS_FIYATI_01,ORTALAMA_SAT_FIYATI_01,ORT_TRANSFER_FIYATI_01,ORT_MALIYET_FIYATI_01 
ORT_ALIS_FIYATI_02,ORTALAMA_SAT_FIYATI_02,ORT_TRANSFER_FIYATI_02,ORT_MALIYET_FIYATI_02

Şeklinde geri dönüşler olacaktır.
Faydalı olmuştur inşallah. 
İyi Çalışmalar dilerim.
Access'te CROSSTAB QUERY ile çok kolay yapabilirsin.

Bunun dışında normal sql cümlesi ile de yapabilirsin.
CASE(sql server) veya IIF(access) de olur.

SELECT TicUnvan, 
  (CASE UrunAdi WHEN A THEN Miktar END) as MiktarA,
  (CASE UrunAdi WHEN B THEN Miktar END) as MiktarB,
  (CASE UrunAdi WHEN C THEN Miktar END) as MiktarC

Sonra bunları GROUP BY / SUM yapabilirsin.
Basit ve Dinamik bir procedure ile PivotTable oluşturmaya fikir vermesi açısından örnek yapmaya çalıştım.
Umarım işi yarar

    Create proc [dbo].[TNSP_PivotTable]
    (
       @SqlMainDataText NVarchar(max),
       @ColumnsFieldName Varchar(100),
       @DataFieldName Varchar(100)
   )
   As
   Begin

       Declare @sSqlText NVarchar(Max),
               @sCol NVarchar(max),
               @nColumns NVarchar(max)


       Set @sSqlText = '
                       Select @sCol = 
                           Stuff (
                                  (SELECT '','' + QUOTENAME (CAST(t.' + @ColumnsFieldName + ' AS VARCHAR(100)) )
                                     FROM ( ' + @SqlMainDataText + ') t
                                       GROUP BY T.' + @ColumnsFieldName + '
                                       ORDER BY ' + @ColumnsFieldName + '
                                       FOR XML PATH (''''), TYPE).value (''.'', ''NVARCHAR(MAX)''),1,1,'''' );
                       '
       EXEC sp_executesql
           @sSqlText,
           N'@sCol nvarchar(max) OUTPUT',
           @sCol OUTPUT

       Set @nColumns = Replace(@sCol, '].[', '],[')
       --Print @nColumns

       Set @sSqlText = 'Select * 
                          From ( ' 
                                + @SqlMainDataText + 
                               ') as pTable
                         Pivot (
                                Sum(' + @DataFieldName + ')
                                For ' + @ColumnsFieldName + ' IN (' + @nColumns + ')
                               )
                           As Pvt
                    '
       EXEC sp_executesql
           @sSqlText
   End

Kullanımı
    Declare @SqlText NVarchar(max)

   Set @SqlText = 'Select YukID, MasrafKalemi, Sum(Tutar) As Tutar
                                 From YuklerAracGiderleri YAG 
                                      Inner Join GiderKalemleri GK On GK.ID = YAG.AracGiderleriKalemID 
                                Group BY YukID, MasrafKalemi
                              '
   Exec TNSP_PivotTable @SqlMainDataText = @SqlText,
                        @ColumnsFieldName = 'MasrafKalemi',
                        @DataFieldName = 'Tutar'
@adelphiforumz @FiRewaLL Kod örnekleriniz için teşekkürler bende sizin kodlara benzer bir şekilde yaptım dinamik yapıyı.
(04-01-2019, Saat: 02:03)KUNTAY Adlı Kullanıcıdan Alıntı: [ -> ]@adelphiforumz   @FiRewaLL  Kod örnekleriniz için teşekkürler bende sizin kodlara benzer bir şekilde yaptım dinamik yapıyı.

Teşekkürlerinizi Puanlarla taçlandırmanız dileği ile  Smile
(04-01-2019, Saat: 09:34)adelphiforumz Adlı Kullanıcıdan Alıntı: [ -> ]
(04-01-2019, Saat: 02:03)KUNTAY Adlı Kullanıcıdan Alıntı: [ -> ]@adelphiforumz   @FiRewaLL  Kod örnekleriniz için teşekkürler bende sizin kodlara benzer bir şekilde yaptım dinamik yapıyı.

Teşekkürlerinizi Puanlarla taçlandırmanız dileği ile  Smile

Vermeyenlerin açığını kapatıyorum. Smile
Sayfalar: 1 2