SELECT 
  FORMAT(A.PTARIH, 'MMMM', 'tr-TR') AS Ay,

  -- Grup Adı sabit: her durumda UG.ADI
  UG.ADI AS GrupAdi,

  CASE 
    WHEN GROUPING(U.ADI) = 1 AND GROUPING(D.ADI) = 0 THEN '***Grup Ara Toplam***'
    WHEN GROUPING(U.ADI) = 1 AND GROUPING(D.ADI) = 1 THEN '***Ay Genel Toplamı***'
    ELSE D.ADI
  END AS Departman,

  -- Ürün Adı sütunu: sadece detay satırlarda ürün adı, diğer durumlarda boş
  CASE 
    WHEN GROUPING(U.ADI) = 1 THEN '------------'
    ELSE U.ADI
  END AS UrunAdi,

  SUM(S.ADET) AS SatisAdet,
  SUM(S.TUTAR) AS SatisToplamı

FROM A_AdsSatir S
LEFT JOIN A_Adisyon A ON A.ID = S.FISID
LEFT JOIN (
    SELECT KODU, ADI FROM DEPARTMAN
    UNION ALL
    SELECT '20', 'Paket Satis'
    UNION ALL
    SELECT '22', 'Hizli Satis'
) D ON D.KODU = A.DEPKODU
LEFT JOIN URUN U ON U.KODU = S.URUNKODU
LEFT JOIN UGRUP UG ON UG.KODU = U.GRUP
WHERE A.PTARIH IS NOT NULL

GROUP BY GROUPING SETS (
  (FORMAT(A.PTARIH, 'MMMM', 'tr-TR'), UG.ADI, D.ADI, U.ADI), -- detay
  (FORMAT(A.PTARIH, 'MMMM', 'tr-TR'), UG.ADI, D.ADI),         -- ara toplam
  (FORMAT(A.PTARIH, 'MMMM', 'tr-TR'))                         -- ay toplamı
)

ORDER BY 
  MIN(A.PTARIH),
  ISNULL(UG.ADI, 'zzz'),
  ISNULL(D.ADI, 'zzz'),
  ISNULL(U.ADI, 'zzz');
