SQL ile kayıtları tek satırda birleştirme ile alakalı bir yöntemi sizlerle paylaşıyor olacağım. Bu makalemizde benim ilk defa ihtiyaç duyduğum bir şeyi sizlerle paylaşmak istiyorum programlama tarafında çok basit bir şekilde join metod’ları ile 1’den fazla kaydın aralarında ayraç konularak birleştirilmesi sağlanabiliyorken, sql’de ne yazıkki direk olarak bu işi gören fonksiyon yok.
SQL İle Kayıtları Tek Satırda Birleştirme Yöntemi
Sql’de birleştirme işlemi için sizlerle paylaşmış olduğum alttaki kodu deneyerek direk olarak birden fazla kaydın aralarında virgül ayracı konularak tek satırda birleştirildiğini görebilirsiniz.
Örnek
SQL
Alttaki kodlarda yeni bir tablo oluşturma, tabloyu bazı kayıtlarla besleme, bu tablodaki kayıtları tek satırda birleştirip gösteren select kodu son olarak mytable adındaki tablo ile işi bittiği için tabloyu drop eden kod mevcut ama siz mevcut tablonuzda doğrudan kullanmak için sadece select kodunu kendi tablonuza göre düzenleyerek kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | create table mytable ( id int identity(1, 1), PersonID int, Unit varchar(10) ), insert into mytable values (1, 'Murat'), (1, 'Öner'), (1, 'Hakan'), (1, 'Osman'), (1, 'Güven'), (1, 'Duran'), (1, 'Soner'), (1, 'Halil'), (1, 'Güven'), (1, 'Cevdet'), (1, 'Serpil'), (1, 'Sevda'), (1, 'Sevgi'), (1, 'Hülya'), (1, 'Sakine'), (1, 'Melek'), (1, 'Hatice'), (1, 'Ramazan'), (2, 'İsmail'), (2, 'Bilal'), (2, 'Mustafa'), (3, 'Yunus') SELECT t1.PersonID, Units = REPLACE( ( SELECT Unit AS [data()] FROM mytable t2 WHERE t2.PersonID = t1.PersonID ORDER BY Unit FOR XML PATH('') ), ' ', ',' ) FROM mytable t1 GROUP BY PersonID; drop table mytable |
Sonuç
PersonId | Units |
---|---|
1 | Cevdet,Duran,Güven,Güven,Hakan,Halil,Hatice,Hülya,Melek,Murat,Öner,Osman,Ramazan,Sakine,Serpil,Sevda,Sevgi,Soner |
2 | Bilal,Ismail,Mustafa |
3 | Yunus |
Eğer projeyi canlı olarak görmek ve düzenlemek isterseniz http://sqlfiddle.com/#!18/0bbec/1 linkini ziyaret edin.
📚 SQL ile Kayıtları Tek Satırda Birleştirme İle Alakalı Diğer Makalelerimiz
- SQL Server Üzerinden Windows Servisleri Yönetmek
- Sql Server COALESCE İfadesi Kullanımı
- Sql Server ile C# Türü Eşleştirme Tablosu
✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.
🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.
👋 Bir sonraki makalede görüşmek dileğiyle.
Yan yana yazılacak veriler arasında boşluk olduğunda her boşluğun arasına virgül atıyor.
Her veriden sonra tek virgül atmasını nasıl sağlayabilirm
Olan: Konica,Minolta,Bizzhub,Pro,Roland,Rekord
İstenen: Konica Minolta,Bizzhub Pro,Roland
Öncelikle subquery’de bir birleştirme yapıp ardından “Ad Soyad!” şeklinde çıktı elde ederseniz ardından “!” işareti olan yerleri “,” ile birleştir derseniz ihtiyacını karşılar diye düşünüyorum.
hocam tablom şu şekilde;
ad soyad ödeme
ali yaşar 12
ali yaşar 16
ali yaşar 10
ayşe okur 5
ayşe okur 8
hocam ben bu isimleri tabloda 1 kere gözükecek şekilde ve ödemeleride toplayarak nasıl yazabilirim.
çıktı şöyle olmalı
ad soyad ödeme
ali yaşar 38
ayşe okur 13
Select Adsoyad , Sum(Odeme) From Tablo
where ile koşul yazabilirsin yoksa yazmadan where i silip direk alttaki satırı buraya koy
Group by Adsoyad
@Yagmur Ekşi, kusura bakma yorumunu yeni farkediyorum. Bu sorgu ihtiyacını karşılayacaktır diye düşünüyorum.
Üstteki sorgu ve sonucunu http://sqlfiddle.com/#!18/99e19/2 sitesinden görebilirsin
SELECT t1.PersonID,
Units =REPLACE( (SELECT Unit AS [data()]
FROM mytable t2
WHERE t2.PersonID = t1.PersonID
ORDER BY Unit
FOR XML PATH(”)
), ‘ ‘, ‘,’)
FROM mytable t1
GROUP BY PersonID ;
Şu kodu istediğim sorguda kullandım ama Unıt kısmına örneğin StockCategories.Name yazdığımda şeklinde bir tag açıyor bu tagi kaldırma gibi bir şansım var mıdır cevaplarsanız cok büyük yardımınız dokunacak.Şimdiden teşekkürler 🙂
Sonucu bir ekran görüntüsü ile paylaşma imkanınız var mı? sorunu tam olarak anlamayamadımda.
Hocam iyi günler. Muhteşem paylaşımlarınız için teşekkür ederim öncelikle
bir konuda yardımınızı isteyecektim.
Bir veri tabanı oluşturuyorum.
Demirbaş Programı gibi
Sahıs/lar ve onlara ait materyaller var.
1 sahsın
hem laptobu mp3 çaları, hem pc si hemde telefonu var ve bu malzemelerin özellikleri
ben bunu nasıl oluşturacağımı bilemedim.
Malzeme Giriş diye Hem veri tabanında hemde kodda.yardım edebilirseniz cok sevinirim.
ad – soyad – tc
pc – marka-modeli-seri no-boyut
pc – marka-modeli-seri no-boyut
mp3- marka-modeli-seri no-boyut
cepTel- marka-modeli-seri no-boyut
KAYDET
bu sekilde tekbir formda/tekbir tuşla Şahsa ait tüm materyallerin KAYDET VeriTabanına yapmamız mümkün mü hocam.
Merhaba ibrahim,
Öncelikle değeri görüşün için teşekkür ederim.
Yapacağın bu uygulama web yada masaüstü için mi onu belirtmemişsin ama sana yardımcı olması adına yapacağım açıklama her iki platform içinde geçerli olacak zaten. Öncelikle 1’e çok bir ilişki durumu söz konusu Person, Customer yada User diye bir tablon olacak ben User olduğunu varsayıyorum her bir kişi için birden fazla cihaz durumu söz konusu olduğundan UserDevices diye bir tablon olur ve bunun içinde User tablosu için ForeignKey ilişkisi kurulmuş UserId adında bir kolonun olur böylelikle 1’e çok ilişki durumunu tablo tarafında oluşturabilirsin.
Arayüz tarafında bir’e çok ilişki için bir kullanıcıya kaç tane cihaz ekleneceği bilinmediğinden generic bir yapı kurman gerekecej giriş nesneleri generic olarak eklenip çıkarılabilecek değerler yine dinamik biçimde alınarak veritabanına insert işleminin gerçekleştirilmesi sağlanacak. İş yoğunluğum açısından örnek yapabilmem mümkün olmadı ama takıldığın yerlerde yardımcı olmaya çalışırım.
Hocam iyi calismalar, yukarıdaki örneği sql compact ta nasıl yazmam gerekiyor.
For xml patch sql compacat ta desteklemiyor yasa yapamadım.
Merhaba. Bu konuya benzer bir sorum olacak.
ID Tarih Tip
1 01.01.2017 1
1 02.03.2017 2
2 03.04.2017 1
2 04.04.2017 2
Yukarıdaki tabloyu ID ye göre gruplama yaparak göstermek istiyorum. Ancak 2 adet tarih olacak. Tip 1 olanlar Tarih 1 , Tip 2 olanlar Tarih 2 kolonuna yazılacak. Bunu nasıl yapabilirim acaba?
Örn:
ID Tarih1 Tarih2
1 01.01.2017 02.03.2017
2 03.04.2017 04.04.2017
Merhaba,
Eğer gruplanacak id değeri dinamik olarak sayısı 2’den fazla olmayacak ve en fazla 2 olacak ise alttaki subquery’li çözüm ihtiyacınızı giderebilir.
Sonuca şu linkten bakabilirsiniz: http://dbfiddle.uk/?rdbms=mariadb_10.2&fiddle=97c49f005f58431a07c266c7343c77eb
Merhaba,
İlginiz için teşekkür ederim. Bu çözüm işimi görüyor ancak müsadeniz olursa size bir fikir danışmak istiyorum.
Bir CRM geliştirdim. Arka planda bir sürü modül ve kullanıcı bir yetkilendirme kontrolü ile çalışıyor. Ben bu sistem için güzel bir Log modülü geliştirmek istiyorum. Yapılan sorguları, güncelleme, ekleme, silme, Mail gönderme, Yazıcıdan çıktı alma vs vs herşeyi kayıt altına alan bir yapı oluşturmak istiyorum. Yukarıdaki takıldığım kısım aslında bu yapı içerisindeki Oturum açma ve Kapatma kayıtlarını nasıl kayıt altına alırım diye düşünürken çıktı.
Normalde sadece tek tarih (LogTarihi) olarak işlemleri kayıt altına alacaktım. Sonrasında Oturum açıldığında açılan oturumun ne zaman kapandığı bilgisinin lazım olabileceğini düşündüm ve LogStartDate ve LogEndDate diye 2 tarih mi yapayım yoksa aynı session için Oturum açıldı ve Kapandı diye 2 kayıt mı açayım fikri arasında kaldım. Çift tarih kullanırsam birçok kayıt için tarih alanlarından birisi boş kalacak. Ancak tek tarih kullanırsam da her session için çift kayıt oluşmuş olacak ve bu 2 kaydı birleştirmek için kullanılan sorgu daha fazla yoracak sistemi.
Uzun bir yazı olduysa kusura bakmayın ama sizce bir Log tablosu nasıl olmalı, Ne tür kayıtlar ve ne tür alanlar ile tutulmalı. Ve yukarıdaki gibi bir düşünce içerisinde olsaydınız hangisini yapardınız?
İlginiz için şimdiden teşekkür ederim…
Rica ederim inşallah ihtiyacınızı karşılar.
Log tablosu konusunda daha önce onlarca projedeki tecrübelerime dayanarak belki yol gösterebilirim ama doğruluğu elbetteki tartışılabilir projelerimde klasik olarak log tablom şu şekilde oluyor.
ID – Otomatik Artan Sayı vey Guid,
FormName yada PageName – İşlemin eğer web projesi ise hangi sayfadan windows projesi ise hangi form’dan yapıldığını belirtebileceğimiz alandır,
EventName – Benzersiz bir olay adı girmelisiniz,
Data – Hangi veriler üzerinden işlem yapıyorsanız bu verileri isterseniz metinsel olarak birleştirip kaydedebilirsiniz isterseniz blob bir nesne olarak kaydedebilirsiniz,
DurationMilliSeconds – Yapılan işlemin süresini tutabilirsiniz,
Description – Log’un ne olduğunu anlatan kısa ve öz açıklama.
CreatedDate – Logun oluşturulma tarihi ve saati,
CreatedUser – Oluşturan kullanıcı diye adlandırılabilir ama alana verilecek değer sistem eğer kullanıcı bazlı çalışıyor ise kullanan kişinin id’si verilebilir.
IP – Projenin kullanıldığı ip adresi kaydedilmelidir.
Benim önerebileceğim örnek log tablosu bu şekilde olabilir belirtmiş olduğunuz gibi kullanıcının sırf giriş çıkışı için 2 tarih alanı ile hiç kullanılmayacak kullanıcı girişi haricindeki diğer olaylarda belkide hiç kullanılmayacaktır o yüzden kullanıcının çıkışınıda farklı bir olay olarak kaydetmelisiniz ki şöyle bir durumda söz konusu olacaktır kullanıcı giriş yaptı ama çıkış yapmadan tarayıcıyı kapattı fakat henüz oturumu sona ermediği için kullanıcının çıkışını kayıt altına alamacayaksınız çünkü kullanıcı çıkış işlemi gerçekleştirmedi size tarayıcı kapattığında bu durumu kullanıcı çıkış yaptı olarak algılarsanız bir mantıksızlık ortaya çıkacağından ayrı bir kayıt olarak eklemeniz daha doğru olacaktır fakat belirtmiş olduğum gibi kullanıcının giriş yapıp çıkış yapmadığı çünkü kendi isteği ile oturum kapatma işlemi gerçekleştirmeyip oturum süresi dolduğu için sistem tarafından otomatik kapatılma işlemi gereçekleştiğinden çıkış logu alamayacaksınızdır ama illaki çıkışıda yakalamak istiyorum derseniz şöyle yapmanız mümkün session timeout event’inde session’da ilgili kullanıcıya ulaşıp çıkış log’unu bu şekilde yapıp sorunu giderebilirsiniz.
Merhaba,
Yanlış birşey mi sordum. Yorumumu silmişsiniz?
Pardon. Denetim için bekleniyormuş o sebeple görünmüyordu. Şimdi hepsi birden göründü. Kusura bakmayın 🙂
Merhaba hocam,
Benim ihtiyacım olan sorgu ProductIDAndCategoriID tablosunda tuttuğum bir ürünün birden fazla kategoriye girmesi çekeceğim sorguda da aynı ürüne ait kategorileri tek satırda göstermek. Aşağıdaki
çektiğim sorgu aşağıdaki gibi dönmeli bunu nasıl yaparım yardımlarınzı rica ediyorum. Teşekkürler.
ProductID CategoriID
1 2,3,5,6,7
2 5,9,10,12,18
Merhaba,
Özür dilerim ama tam olarak yapmak istediğinizi anlamadım ilgili tablo yapısını bana mail yolu ile iletirseniz bu şekilde daha sağlıklı yardımcı olabilirim ve yapmak istediğiniz daha net biçimde belirtebilirseniz memnun olurum.
Vermiş olduğunuz ilgili örnek aslında aradığıma çözüm oldu. Teşekkür ederim. Çok sağolun.
Rica ederim ihtiyacınızı karşılamasına sevindim.
Üstad teşekkürler işime yaradı
Rica ederim ihtiyacınızı karşılamasına sevindim.