Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
MSSQL Sorgulama Sorunu
#1
Sql Server ile daha önce hiç çalışmadım yavaş yavaş öğrenmeye çabalıyorum. Sorunum Mysql ile aşağıdaki şekilde kullandığım sorgumu Mssql üzerinde denediğim zamana hata alıyorum

SELECT pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad,
MAX(case when pdksshift.islemtarihi = '''+ tarihler[0]+''' then pdksshift.shift end) AS '''+tarihler[0]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[1]+''' then pdksshift.shift end) AS '''+tarihler[1]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[2]+''' then pdksshift.shift end) AS '''+tarihler[2]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[3]+''' then pdksshift.shift end) AS '''+tarihler[3]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[4]+''' then pdksshift.shift end) AS '''+tarihler[4]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[5]+''' then pdksshift.shift end) AS '''+tarihler[5]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[6]+''' then pdksshift.shift end) AS '''+tarihler[6]+'''
FROM pdkspersonel inner join pdksshift on pdkspersonel.sicil=pdksshift.sicil 
WHERE pdkspersonel.departman = '''+departmanCB.text+''' and pdkspersonel.isciktar IS NULL 
GROUP BY pdksshift.sicil 
ORDER BY pdkspersonel.sirano

denediğim kod
SELECT pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad,
MAX(case when pdksshift.islemtarihi = @tarihler1 then pdksshift.shift end) AS @tarihler1,
MAX(case when pdksshift.islemtarihi = @tarihler2 then pdksshift.shift end) AS @tarihler2,
MAX(case when pdksshift.islemtarihi = @tarihler3 then pdksshift.shift end) AS @tarihler3,
MAX(case when pdksshift.islemtarihi = @tarihler4 then pdksshift.shift end) AS @tarihler4,
MAX(case when pdksshift.islemtarihi = @tarihler5 then pdksshift.shift end) AS @tarihler5,
MAX(case when pdksshift.islemtarihi = @tarihler6 then pdksshift.shift end) AS @tarihler6,
MAX(case when pdksshift.islemtarihi = @tarihler7 then pdksshift.shift end) AS @tarihler7
FROM pdkspersonel inner join pdksshift on pdkspersonel.sicil=pdksshift.sicil 
WHERE pdkspersonel.departman = @departman and pdkspersonel.isciktar IS NULL 
GROUP BY pdksshift.sicil 
ORDER BY pdkspersonel.sirano

aldığım hata

Column 'pdkspersonel.sirano' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Bu işlemi nasıl gerçekleştirebilirim acaba ? Şimdidien teşekkür eder iyi çalışmalar dilerim
Cevapla
#2
Burada zaten diyor ki su sira no ne max fonksiyonda ne de group by da bulunamadı

eğer toplama gibi fonksiyonlar kullanırsanız usteki alanları hepsi group by'a koymanız lazım

GROUP BY pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad

gibi
Cevapla
#3
Sorunumu şöyle anlatayım.
id sicil shiftyil shiftay shiftgun shiftislemtarihi shift 
1 T1001     2020 1 27 2020-01-27 09-18 
2 T1001     2020 1 28 2020-01-28 09-18 
3 T1001     2020 1 29 2020-01-29 09-18 
4 T1001     2020 1 30 2020-01-30 09-18 
5 T1001     2020 1 31 2020-01-31 09-18 
6 T1001     2020 2 1 2020-02-01 09-18 
7 T1001     2020 2 2 2020-02-02 09-18 

id sicil personelsirano adisoyadi departman

1 T1001   02         BORA KANTUR MALİ İŞLER   

Öğrenmek istediğim yukarıdaki gibi iki adet tablom mevcut. Ben bu iki tablodan bilgi çekip

personelsirano sicil adisoyadi 2020-01-27 2020-01-28 2020-01-29 2020-01-30 2020-01-31 2020-02-01 2020-02-02
02   T1001 BORA KANTUR 09-18 09-18 09-18 09-18 09-18 09-18 09-18

gibi sorgulamak istiyorum. Bunu nasıl yapabilirim
Cevapla
#4
burada zaten 2 tablo var iki tablo da kolayca bilrleştirebilirsin
1. tablo adı shifttablo olsun
2. tablo adı personeltablo olsun

select p.personelsirano,p.sicil,p.adisoyadi,s.shiftislemtarihi where personeltablo p, shifttablo s where p.sicil = s.sicil order by s.shiftislemtarihi desc

Gibi
Cevapla
#5
Anladığım kadarıyla PIVOT table oluşturman gerekiyor. (MAX & GROUP BY sağlıklı bir yaklaşım değil)
yani, "pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad," kolonlarının yanına bazı tarihleri kolon olarak, yani "tarih_2020_01_27" kolonu, "tarih_2020_01_28" kolonu, "tarih_2020_01_30" kolonu gibi yanına eklemek istiyorsun... sql server'da buna PIVOT deniliyor. Senin soruna doğru TSQL kodunu yazmak mümkün, ama elimizde tablo varsa... tablo olmadan PIVOT sorguyu yazamayız. ama PIVOT sorgunun nasıl yapıldığına dair basit bir örnek (buna bakarak);

SELECT * FROM
(
SELECT X, COUNT(*) Y FROM [Table1]
GROUP BY X
) Table2
PIVOT
(
SUM(Y) FOR X IN([VALUE1], [VALUE2], [VALUE3], [VALUE4], [VALUE5],...)
) PivotTable

bu örnekteki [VALUE1], [VALUE2], [VALUE3], [VALUE4], [VALUE5] bunlar senin tarih kolonların

tüm bunları yazdım ama hala aklımda şu soru var; adamın sorusunu doğru mu anladım ?

lütfen sorunu biraz daha açarak sorar mısın ? sonuçta devlet sırrı bir proje değil sanki Smile
Cevapla
#6
(07-02-2020, Saat: 15:05)bkantur Adlı Kullanıcıdan Alıntı: Sql Server ile daha önce hiç çalışmadım yavaş yavaş öğrenmeye çabalıyorum. Sorunum Mysql ile aşağıdaki şekilde kullandığım sorgumu Mssql üzerinde denediğim zamana hata alıyorum

SELECT pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad,
MAX(case when pdksshift.islemtarihi = '''+ tarihler[0]+''' then pdksshift.shift end) AS '''+tarihler[0]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[1]+''' then pdksshift.shift end) AS '''+tarihler[1]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[2]+''' then pdksshift.shift end) AS '''+tarihler[2]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[3]+''' then pdksshift.shift end) AS '''+tarihler[3]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[4]+''' then pdksshift.shift end) AS '''+tarihler[4]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[5]+''' then pdksshift.shift end) AS '''+tarihler[5]+''',
MAX(case when pdksshift.islemtarihi = '''+ tarihler[6]+''' then pdksshift.shift end) AS '''+tarihler[6]+'''
FROM pdkspersonel inner join pdksshift on pdkspersonel.sicil=pdksshift.sicil 
WHERE pdkspersonel.departman = '''+departmanCB.text+''' and pdkspersonel.isciktar IS NULL 
GROUP BY pdksshift.sicil 
ORDER BY pdkspersonel.sirano

denediğim kod
SELECT pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad,
MAX(case when pdksshift.islemtarihi = @tarihler1 then pdksshift.shift end) AS @tarihler1,
MAX(case when pdksshift.islemtarihi = @tarihler2 then pdksshift.shift end) AS @tarihler2,
MAX(case when pdksshift.islemtarihi = @tarihler3 then pdksshift.shift end) AS @tarihler3,
MAX(case when pdksshift.islemtarihi = @tarihler4 then pdksshift.shift end) AS @tarihler4,
MAX(case when pdksshift.islemtarihi = @tarihler5 then pdksshift.shift end) AS @tarihler5,
MAX(case when pdksshift.islemtarihi = @tarihler6 then pdksshift.shift end) AS @tarihler6,
MAX(case when pdksshift.islemtarihi = @tarihler7 then pdksshift.shift end) AS @tarihler7
FROM pdkspersonel inner join pdksshift on pdkspersonel.sicil=pdksshift.sicil 
WHERE pdkspersonel.departman = @departman and pdkspersonel.isciktar IS NULL 
GROUP BY pdksshift.sicil 
ORDER BY pdkspersonel.sirano

aldığım hata

Column 'pdkspersonel.sirano' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Bu işlemi nasıl gerçekleştirebilirim acaba ? Şimdidien teşekkür eder iyi çalışmalar dilerim

Buradaki hata şudur, MAX işlemleri yapıyorsunuz, iyi güzel, 2. kolona göre de gruplamışsınız, o da iyi, ama 1. ve 3. field'ler ne aggregate fonksiyon ve ne de onlara göre de gruplama var. Bu tablonun özelinde 2. kolon değişmediği sürece 1. ve 3. kolon da değişmiyor. Ama bunu siz biliyorsunuz. Olasılık olarak değişmesi mümkün, e peki değişirse o kolon için hangi değeri yazacak. Hatayı bu nedenle veriyor. Bundan kaçınmanın yolu, 1. ve 3. kolonları da Group By'a eklemektir.
yani
..
GROUP BY pdkspersonel.sirano,pdkspersonel.sicil,pdkspersonel.adsoyad
...

şeklinde yazarsanız hata almayacağınızı sanıyorum!
Cevapla
#7
Vermiş olduğunuz cevaplar ve göstermiş olduğunuz işlem yolları için teşekkür ederim.

DECLARE @departman nchar(50)

SET @departman = 'MUHASEBE' 

SELECT * FROM   
( SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift     
   FROM pdks_personellistesi p INNER JOIN pdks_shiftlistesi c ON c.sicil = p.sicil WHERE departman=@departman
AND shiftislemtarihi between '2020-01-27' and '2020-02-02'
) t 

PIVOT(
max(shift) 
   FOR shiftislemtarihi IN ([2020-01-27],[2020-01-28],[2020-01-29],[2020-01-30],[2020-01-31],[2020-02-01],[2020-02-02]
)) AS pivot_table  

şu anda yukarıdaki kod ile listeleyebiliyorum.

peki pivot kısmında vermiş olduğum tarihlerin yerine değişken tanımlayarak kendi istediğim iki tarih arasını sorgulayabilirmiyim

DECLARE @departman nchar(50), @baslamatarihi date, @bitistarihi date
DECLARE @tarih1 date, @tarih2 date, @tarih3 date, @tarih4 date, @tarih5 date, @tarih6 date, @tarih7 date

SET @baslamatarihi = dateadd(day,-1,'2020-01-27')
SET @bitistarihi = dateadd(day,+7,@baslamatarihi)
SET @departman = 'MUHASEBE' 
   
SET @tarih1=dateadd(day,+1,@baslamatarihi)
SET @tarih2=dateadd(day,+2,@baslamatarihi)
SET @tarih3=dateadd(day,+3,@baslamatarihi)
SET @tarih4=dateadd(day,+4,@baslamatarihi)
SET @tarih5=dateadd(day,+5,@baslamatarihi)
SET @tarih6=dateadd(day,+6,@baslamatarihi)
SET @tarih7=dateadd(day,+7,@baslamatarihi)

SELECT * FROM   
( SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift     
   FROM pdks_personellistesi p INNER JOIN pdks_shiftlistesi c ON c.sicil = p.sicil WHERE departman=@departman
AND shiftislemtarihi between @baslamatarihi and @bitistarihi
) t 

PIVOT(
max(shift) 
   FOR shiftislemtarihi IN ([@tarih1],[@tarih2],[@tarih3],[@tarih4],[@tarih5],[@tarih6],[@tarih7]
)) AS pivot_table  

vereceğiniz cevaplar için şimdiden teşekkür eder iyi haftasonları dilerim.
Cevapla
#8
Alttaki kod ile PRINT @sql dediğim zaman @departman değişkenini MUHASEBE yazıyor onu tırnak içine alırsam kod çalışıyor. Ama bir türlü tırnak ekletemedim. Çalışmalarım ve araştırmalarım devam ediyor. 

DECLARE @departman nchar(50), @baslamatarihi date, @bitistarihi date;
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @departman = 'MUHASEBE' 
SET @baslamatarihi = '2020-01-27'
SET @bitistarihi = dateadd(day,+6,@baslamatarihi)

SET @columns = N'';
SELECT @columns += N', c.' + QUOTENAME(shiftislemtarihi)
 FROM (SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift     
   FROM pdks_personellistesi p INNER JOIN pdks_shiftlistesi c ON c.sicil = p.sicil
AND shiftislemtarihi between @baslamatarihi and @bitistarihi
) AS B GROUP BY shiftislemtarihi;
SET @sql = N'
SELECT * FROM
(
 SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift     
   FROM pdks_personellistesi p INNER JOIN pdks_shiftlistesi c ON c.sicil = p.sicil WHERE departman='+@departman+'

) t
PIVOT( max(shift) FOR shiftislemtarihi IN ('+ STUFF(REPLACE(@columns, ', c.[', ',['), 1, 1, '')+ ')) AS pivot_table;'; 

Cevapla
#9
Sorunumu alttaki kodlar ile çözdüm ihtiyacı olan ve benim gibi acemi arkadaşlar için buraya bırakıyorum. Yardımcı olan bütün arkadaşlara teşekkür ederim.

DECLARE @bitistarihi date, @columns NVARCHAR(MAX), @sql NVARCHAR(MAX)
SET @bitistarihi = dateadd(day,+6,@baslamatarihi)

SET @columns = N'' SELECT @columns += N', c.' + QUOTENAME(shiftislemtarihi)
FROM (SELECT p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift
FROM personel.dbo.pdks_personellistesi p INNER JOIN personel.dbo.pdks_shiftlistesi c ON c.sicil = p.sicil
AND shiftislemtarihi between @baslamatarihi and @bitistarihi
) AS B GROUP BY shiftislemtarihi;
SET @sql =N'SELECT * FROM
(SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift
FROM personel.dbo.pdks_personellistesi p INNER JOIN personel.dbo.pdks_shiftlistesi c ON c.sicil = p.sicil WHERE departman=' + Char(39) + @departman+ Char(39) +' 
order by personelsirano asc offset 0 rows) t
PIVOT( max(shift) FOR shiftislemtarihi IN ('+ STUFF(REPLACE(@columns, ', c.[', ',['), 1, 1, '')+ ')) AS pivot_table;';

EXECUTE (@sql);
Cevapla
#10
1 SET @sql ='SELECT * FROM
2 (SELECT p.personelsirano,p.sicil,p.adisoyadi,c.shiftislemtarihi,c.shift
3 FROM personel.dbo.pdks_personellistesi p INNER JOIN personel.dbo.pdks_shiftlistesi c ON c.sicil = p.sicil WHERE departman=' + Char(39) + @departman+ Char(39) +'
4 order by personelsirano asc offset 0 rows) t
5 PIVOT( max(shift) FOR shiftislemtarihi IN ('+ STUFF(REPLACE(@columns, ', c.[', ',['), 1, 1, '')+ ')) AS pivot_table;'

WHERE koşulunu 3. ve 4. satır arasına yazabilirsin, veya PIVOT işi bittikten sonraki 5. satırdan sonra da WHERE koyabilirsin
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Lightbulb Mssql ve MS Server Upgrade'i arikeness 1 819 01-08-2025, Saat: 11:22
Son Yorum: maxpaynen
  Türkçe karakter sorunu barissagir 2 1.372 31-08-2024, Saat: 15:52
Son Yorum: barissagir
  MSSQL Data downgrade (Alt sürüme veri aktarma) işlemleri adelphiforumz 0 1.218 23-03-2023, Saat: 11:13
Son Yorum: adelphiforumz
  MSSQL eş zamanlı yazma ve okuma kontrolü (Çözüldü) adelphiforumz 5 3.315 31-12-2021, Saat: 13:04
Son Yorum: adelphiforumz
  MSSQL TableType tipinde parametre nasıl geçilir? adelphiforumz 28 12.346 29-12-2021, Saat: 11:37
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi