SELECT 
  CAST(A.PTARIH AS DATE) AS Tarih,

  CASE 
    WHEN GROUPING(CAST(A.PTARIH AS DATE)) = 1 THEN '***Genel Toplam***'
    WHEN GROUPING(U.ADI) = 1 THEN '***Gün Toplamı***'
    ELSE 
      CASE 
        WHEN A.DEPKODU = 20 THEN 'Paket Satis'
        WHEN A.DEPKODU = 22 THEN 'Hizli Satis'
        ELSE ISNULL(MAX(D.ADI), 'Bilinmeyen')
      END
  END AS Departman,

  CASE 
    WHEN GROUPING(U.ADI) = 1 THEN '------------'
    ELSE UG.ADI
  END AS GrupAdi,

  CASE 
    WHEN GROUPING(U.ADI) = 1 THEN '------------'
    ELSE U.ADI
  END AS Urun,

  SUM(S.ADET) AS Adet,
  SUM(S.TUTAR) AS Tutar

FROM A_Adisyon A
LEFT JOIN DEPARTMAN D ON D.KODU = A.DEPKODU
INNER JOIN A_AdsSatir S ON S.FISID = A.ID
INNER 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 (
  (CAST(A.PTARIH AS DATE), U.ADI, UG.ADI, A.DEPKODU),  -- detay
  (CAST(A.PTARIH AS DATE)),                            -- gün toplamı
  ()                                                   -- genel toplam
)

ORDER BY 
  MIN(CAST(A.PTARIH AS DATE)),
  CASE 
    WHEN GROUPING(CAST(A.PTARIH AS DATE)) = 1 THEN 2    -- genel toplam en son
    WHEN GROUPING(U.ADI) = 1 THEN 1                     -- gün toplamı detayların altına
    ELSE 0                                              -- detaylar üstte
  END,
  UG.ADI,
  U.ADI;
