Yorumları: 21
Konuları: 8
Kayıt Tarihi: 14-04-2017
Rep Puanı: 28 Başlangıç
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
Yorumları: 155
Konuları: 15
Kayıt Tarihi: 18-09-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 609 Acemi
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
Yorumları: 21
Konuları: 8
Kayıt Tarihi: 14-04-2017
Rep Puanı: 28 Başlangıç
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
Yorumları: 155
Konuları: 15
Kayıt Tarihi: 18-09-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 609 Acemi
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
Yorumları: 27
Konuları: 2
Kayıt Tarihi: 04-01-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 78 Başlangıç
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
Yorumları: 240
Konuları: 6
Kayıt Tarihi: 22-10-2018
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.2
- Delphi 10.1
- Delphi 7
- Lazarus / FPC
Rep Puanı: 1.924 Programcı
(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!
Yorumları: 21
Konuları: 8
Kayıt Tarihi: 14-04-2017
Rep Puanı: 28 Başlangıç
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.
Yorumları: 21
Konuları: 8
Kayıt Tarihi: 14-04-2017
Rep Puanı: 28 Başlangıç
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;';
Yorumları: 21
Konuları: 8
Kayıt Tarihi: 14-04-2017
Rep Puanı: 28 Başlangıç
11-02-2020, Saat: 08:28
(Son Düzenleme: 11-02-2020, Saat: 08:29, Düzenleyen: bkantur.)
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);
Yorumları: 27
Konuları: 2
Kayıt Tarihi: 04-01-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 78 Başlangıç
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
|