Skip to main content

AccessTr.neT


Tablodaki Dikey Veriyi Sorguya Yatay Olarak Alma

Tablodaki Dikey Veriyi Sorguya Yatay Olarak Alma

#7
aşağıdaki sorgu kodunu dener misiniz?
TRANSFORM First(r.RaporEkibi) AS FirstOfRaporEkibi
SELECT r.Sira
FROM  
(SELECT q.RaporTuru, q.RaporEkibi, (SELECT COUNT(*)
        FROM (SELECT DISTINCT tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi
FROM tbl_Orders
WHERE tbl_Orders.Rapor="x"
ORDER BY tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi) AS q2
        WHERE q2.RaporTuru = q.RaporTuru
          AND q2.RaporEkibi < q.RaporEkibi
    )+1 AS Sira
FROM (SELECT DISTINCT tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi
FROM tbl_Orders
WHERE tbl_Orders.Rapor="x"
ORDER BY tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi) AS q
ORDER BY q.RaporTuru, q.RaporEkibi) AS r
GROUP BY r.Sira
PIVOT r.RaporTuru In ("Kdv İade","Bağımsız Denetim","Tam Tasdik","Diğer Raporlar");

yada sorguyu parçalara ayırıp 3farklı sorgudan çekerek
1 - qryDistinctRaporEkibi
SELECT DISTINCT tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi
FROM tbl_Orders
WHERE tbl_Orders.Rapor="x"
ORDER BY tbl_Orders.RaporTuru, tbl_Orders.RaporEkibi;
2 - qryRankedRaporEkibi
SELECT q.RaporTuru, q.RaporEkibi, (SELECT COUNT(*)
        FROM qryDistinctRaporEkibi AS q2
        WHERE q2.RaporTuru = q.RaporTuru
          AND q2.RaporEkibi < q.RaporEkibi
    )+1 AS Sira
FROM qryDistinctRaporEkibi AS q
ORDER BY q.RaporTuru, q.RaporEkibi;
3 - Son Sorgu yani qrySon
TRANSFORM First(r.RaporEkibi) AS FirstOfRaporEkibi
SELECT r.Sira
FROM qryRankedRaporEkibi AS r
GROUP BY r.Sira
PIVOT r.RaporTuru In ("Kdv İade","Bağımsız Denetim","Tam Tasdik","Diğer Raporlar");
Cevapla
#8
2 yöntemde de temel sorun verilerin PIVOT r.RaporTuru In ("Kdv İade","Bağımsız Denetim","Tam Tasdik","Diğer Raporlar"); satırına bağımlı olması
ayrıca çoktan aza sıralamak için ("Kdv İade","Bağımsız Denetim","Tam Tasdik","Diğer Raporlar") sıralamasının da çoktan aza bir sırayla yazılması gerek
dolayısıyla rapor türü verileri değiştiğinde sorgu yanlış sonuçlar getirebilir. bu nedenle bu işlemin Vba ile yapılması daha doğru olur
Cevapla
#9
tek Sorgu halinde
TRANSFORM First(r.RaporEkibi) AS EkipAd
SELECT r.Sira
FROM (
	  SELECT q.RaporTuru, q.RaporEkibi, (
										 SELECT COUNT(*)         
										 FROM tbl_Orders AS q2         
										 WHERE q2.RaporTuru = q.RaporTuru           
										   AND q2.RaporEkibi < q.RaporEkibi           
										   AND q2.Rapor="x"     )+1 AS Sira 
	  FROM tbl_Orders AS q WHERE (((q.Rapor) = "x")) 
	 )  AS r
GROUP BY r.Sira
PIVOT r.RaporTuru IN ('Kdv İade','Bağımsız Denetim','Tam Tasdik','Diğer Raporlar');
sorgu oluşturma/güncelleme kodu
Sub DinamikPivotGuncelleYarat()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim xSQL As String
    Dim pivotFields As String
    
    Set db = CurrentDb()
     xSQL = "SELECT RaporTuru " & _
            "FROM tbl_Orders where  (((Rapor)=""x"")) " & _
            "GROUP BY RaporTuru " & _
            "ORDER BY Count(RaporEkibi) DESC;"

    Set rs = db.OpenRecordset(xSQL)
    
    ' PIVOT için kullanılacak sütunları oluştur
    Do While Not rs.EOF
        pivotFields = pivotFields & "'" & rs(0) & "',"
        rs.MoveNext
    Loop
    
    If Len(pivotFields) > 0 Then pivotFields = Left(pivotFields, Len(pivotFields) - 1)
    
    ' sorgudaki PIVOT kısmı güüncellemek için
     xSQL = "TRANSFORM First(r.RaporEkibi) AS EkipAd " & _
            "SELECT r.Sira " & _
            "FROM ( " & _
            "SELECT q.RaporTuru, q.RaporEkibi, (SELECT COUNT(*) " & _
            "        FROM tbl_Orders AS q2 " & _
            "        WHERE q2.RaporTuru = q.RaporTuru " & _
            "          AND q2.RaporEkibi < q.RaporEkibi " & _
            "          AND q2.Rapor=""x"" " & _
            "    )+1 AS Sira " & _
            "FROM tbl_Orders AS q " & _
            "WHERE (((q.Rapor) = ""x"")) " & _
            ") AS r " & _
            "GROUP BY r.Sira " & _
            "PIVOT r.RaporTuru IN (" & pivotFields & ");"
    
    On Error Resume Next
        db.QueryDefs.Delete "SorguAdınız"
    On Error GoTo 0

    ' Yeni sorgu oluştur
    Dim qdf As DAO.QueryDef
    Set qdf = db.CreateQueryDef("SorguAdınız", xSQL)
End Sub
Cevapla
#10
(17/02/2025, 19:16)berduş yazdı: tek Sorgu halinde
TRANSFORM First(r.RaporEkibi) AS EkipAd
SELECT r.Sira
FROM (
	  SELECT q.RaporTuru, q.RaporEkibi, (
										 SELECT COUNT(*)         
										 FROM tbl_Orders AS q2         
										 WHERE q2.RaporTuru = q.RaporTuru           
										   AND q2.RaporEkibi < q.RaporEkibi           
										   AND q2.Rapor="x"     )+1 AS Sira 
	  FROM tbl_Orders AS q WHERE (((q.Rapor) = "x")) 
	 )  AS r
GROUP BY r.Sira
PIVOT r.RaporTuru IN ('Kdv İade','Bağımsız Denetim','Tam Tasdik','Diğer Raporlar');
sorgu oluşturma/güncelleme kodu
Sub DinamikPivotGuncelleYarat()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim xSQL As String
    Dim pivotFields As String
    
    Set db = CurrentDb()
     xSQL = "SELECT RaporTuru " & _
            "FROM tbl_Orders where  (((Rapor)=""x"")) " & _
            "GROUP BY RaporTuru " & _
            "ORDER BY Count(RaporEkibi) DESC;"

    Set rs = db.OpenRecordset(xSQL)
    
    ' PIVOT için kullanılacak sütunları oluştur
    Do While Not rs.EOF
        pivotFields = pivotFields & "'" & rs(0) & "',"
        rs.MoveNext
    Loop
    
    If Len(pivotFields) > 0 Then pivotFields = Left(pivotFields, Len(pivotFields) - 1)
    
    ' sorgudaki PIVOT kısmı güüncellemek için
     xSQL = "TRANSFORM First(r.RaporEkibi) AS EkipAd " & _
            "SELECT r.Sira " & _
            "FROM ( " & _
            "SELECT q.RaporTuru, q.RaporEkibi, (SELECT COUNT(*) " & _
            "        FROM tbl_Orders AS q2 " & _
            "        WHERE q2.RaporTuru = q.RaporTuru " & _
            "          AND q2.RaporEkibi < q.RaporEkibi " & _
            "          AND q2.Rapor=""x"" " & _
            "    )+1 AS Sira " & _
            "FROM tbl_Orders AS q " & _
            "WHERE (((q.Rapor) = ""x"")) " & _
            ") AS r " & _
            "GROUP BY r.Sira " & _
            "PIVOT r.RaporTuru IN (" & pivotFields & ");"
    
    On Error Resume Next
        db.QueryDefs.Delete "SorguAdınız"
    On Error GoTo 0

    ' Yeni sorgu oluştur
    Dim qdf As DAO.QueryDef
    Set qdf = db.CreateQueryDef("SorguAdınız", xSQL)
End Sub

Teşekkürler Hocam
iyiki varsınız!
sağ olun, var olun
truhi, 29-09-2009 tarihinden beri AccessTr.neT üyesidir.
Cevapla
#11
Rica ederim
İyi çalışmalar
Cevapla

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da
Task