Tüm Sınıfa Ait Tüm Notların Listesi ?

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
ofaruk_k
Üye
Mesajlar: 5
Kayıt: 03 Tem 2007 05:20

Tüm Sınıfa Ait Tüm Notların Listesi ?

Mesaj gönderen ofaruk_k »

Merhaba arkadaşlar
Ms-SQL 2005 de
Öğrenci bilgileri, notların ve derslerin tutulduğu üç tablom var.

ogrtablo
ogr_no....adi........soyad
111.........ali.........kaya
222.........ahmet...uzun
.
.
.


dersler
id....dersadi
1.....Matematik
2.....Fizik
.
.
.


notlar
ogr_no....ders....Y1....Y2....Y3
111.........1........96....65....68 (Matematik)
111.........2........75....48....95 (Fizik)
222.........1........74....78....45 (Matematik)
.
.
.




Benim istediğim sorgu sonucu şu çıktıyı almak:

ogr_no...adi...M.Y1......M.Y2......M.Y3......F.Y1.....F.Y2...F.Y3...
111........ali....96.........65.........68.........75.........48......95....


yani tüm dersleri alt alta değilde her öğrenciye yalnız bir satır ayırarak tüm dersleri kolon hâlinde yanına dizmek istiyorum.
Böyle bir çıktıyı nasıl alabilirim?
Keser döner, sap döner. Gün gelir devran döner...
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

kardeş veritabanı olarak ne kullandığını yazmamışsın ama ms sql de bu iş sql server 2005 öncesi

select
sum(case when datepart(dd,Tarih)=1 then Toplamtutar else 0 end ) as BirinciAy,
sum(case when datepart(dd,Tarih)=1 then Toplamtutar else 0 end ) as ikinciAy
from Fatura


şeklinde elde edebilirsin

2005 de ise pivot table diye bir yapı geldi onunla da bu işi yapabilirsin..
iyi çalışmalar..
derviş
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

unalaygun yazdı:kardeş veritabanı olarak ne kullandığını yazmamışsın ama ms sql de bu iş sql server 2005 öncesi

select
sum(case when datepart(dd,Tarih)=1 then Toplamtutar else 0 end ) as BirinciAy,
sum(case when datepart(dd,Tarih)=1 then Toplamtutar else 0 end ) as ikinciAy
from Fatura


şeklinde elde edebilirsin

2005 de ise pivot table diye bir yapı geldi onunla da bu işi yapabilirsin..
iyi çalışmalar..
Arkadaş 2005 diye yazmış :?:
Ben 2005 içindede Case ile yapıyorum.
@unalaygun Pivot hakkında bilgin var ise paylaşabilirmisin?
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
ofaruk_k
Üye
Mesajlar: 5
Kayıt: 03 Tem 2007 05:20

Mesaj gönderen ofaruk_k »

Veritabanı olarak Ms sql server 2005 kullanıyorum.
1) Başka yerlerde de "pivot" kullanımını önerdiler. Fakat kod yazımı hakkında yardımcı olmadılar. Kendim yapmaya çalıştım fakat pivot örneklerine baktım sanırım sadece AVG, COUNT,MAX gibi fonksiyonlarla kullanılabiliyor. Benim istediğim formatta ise bu şekilde nasıl yapılır bilmiyorum. Mümkünse benim istediğim format şeklinde küçük bir kod örneği verebilir misiniz?
2) Case ile de denedim. Yani denemeye çalıştım ama pek bişey yapamadım. :( Mümkünse kod konusunda yardımcı olurmusunuz? :roll:
Şimdiden teşekkürler.
Kolay Gelsin...
Keser döner, sap döner. Gün gelir devran döner...
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

tabiiki

Mesaj gönderen unalaygun »

tamam güzel kardeşim benim şuan bilgisayarımda kurulu değil yarın işyerinde yazayım inşallah öğlen atarım kolay gelsin..
derviş
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Kusura bakma kardeş

Mesaj gönderen unalaygun »

kardeş kusura bakma ancak atabildim
bunu da notpad de yazdım çalışma durumunda sorun çıkarsa dön pivot table da ilk fırsatta atayım.
Ama bende case when kullanıyorum.
Çünkü alışkanlık diyelim ve zaten aslında onunda farklı bir şey yapyığı yok
onu da yazacağım görüşürüz iyi çalışmalar arkadaşlar..


select
ogrtablo.ogr_no as OgrenciNo,
max(ogrtablo.Adi) as Adi,
,max(ogrtablo.soyadi) as soyadi,
case dersler.id
when 1 then 'Matematik'
when 2 then 'Fizik'
when 2 then 'Türkçe'
else '' end as DersAdi,
notlar.Y1,
notlar.Y2,
notlar.Y3
from ogrtablo
inner join ogrtablo.ogr_no=notlar.ogr_no
where
ogrtablo.ogr_no=1

group by dersler.id,ogrtablo.ogr_no
derviş
ofaruk_k
Üye
Mesajlar: 5
Kayıt: 03 Tem 2007 05:20

Mesaj gönderen ofaruk_k »

Merhabalar...

SELECT
ogrtablo.ogr_no as OgrenciNo,
max(ogrtablo.adi) as Adi,
max(ogrtablo.soyadi) as Soyadi,
case dersler.DerslerID
when 1 then 'Matematik'
when 2 then 'Fizik'
when 3 then 'Türkçe'
else ''
end
as DersAdi,
notlar.Y1,
notlar.Y2,
notlar.Y3
from ogrtablo
INNER JOIN
dbo.notlar ON ogrtablo.Ogr_no = notlar.Ogr_no
where
ogrtablo.ogr_no = 1
group by dersler.DerslerID, ogrtablo.ogr_no

şeklinde denedim.
şu mesajı verdi.

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.


:(
Keser döner, sap döner. Gün gelir devran döner...
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

SELECT
ogrtablo.ogr_no as OgrenciNo,
max(ogrtablo.adi) as Adi,
max(ogrtablo.soyadi) as Soyadi,
case dersler.DerslerID
when 1 then 'Matematik'
when 2 then 'Fizik'
when 3 then 'Türkçe'
else ''
end
as DersAdi,
notlar.Y1,
notlar.Y2,
notlar.Y3
from ogrtablo
INNER JOIN
dbo.notlar ON ogrtablo.Ogr_no = notlar.Ogr_no
where
ogrtablo.ogr_no = 1
group by notlar.Ders, notlar.ogr_no

bak bakalım
derviş
ofaruk_k
Üye
Mesajlar: 5
Kayıt: 03 Tem 2007 05:20

Mesaj gönderen ofaruk_k »

Bu hatayı verdi.

Msg 8120, Level 16, State 1, Line 1
Column 'ogrtablo.Ogr_No' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "dersler.DerslerID" could not be bound.

Not: Kusura bakmayın cevapları geç gönderiyorum. Çünkü evimde internet yok. Ancak günde bir defa internete girebildiğimden arada ikişer gün oluşuyor.
En son ofaruk_k tarafından 09 Ağu 2007 06:37 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Keser döner, sap döner. Gün gelir devran döner...
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

güzelim tabloların create scriptlerini gönder o zaman bana da bakayım boyle olmayacak anlaşıldı ufak şeyleri düzeltebilirsin
bekliyorum scriptleri .
kolay gelsin
derviş
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

select
max(ogrtablo.Ogr_No) [öğrenci Numarasi],
max(Adi) as Adi,
max(Soyadi)as Soyadi,
sum(case when DerslerId=1 then Y1 else 0 end) MatematikY1,
sum(case when DerslerId=1 then Y2 else 0 end) MatematikY2,
sum(case when DerslerId=1 then Y3 else 0 end) MatematikY3,
sum(case when DerslerId=2 then Y1 else 0 end) FizikY1,
sum(case when DerslerId=2 then Y2 else 0 end) FizikY2,
sum(case when DerslerId=2 then Y3 else 0 end) FizikY3,
sum(case when DerslerId=3 then Y1 else 0 end) KimyaY1,
sum(case when DerslerId=3 then Y2 else 0 end) KimyaY2,
sum(case when DerslerId=3 then Y3 else 0 end) KimyaY3
from ogrtablo
inner join notlar on notlar.Ogr_No=ogrtablo.Ogr_No
--where
--ogrtablo.Ogr_No in(1,2,3)

group by ogrtablo.Ogr_No

Dersler tablosunu kullanmadan yaptık çünkü denermalizasyon yapmışsın aslında güzelde olmuş böylece bir joinden kurtulduk ama tabi 1,2,3 gibi rakamların ne anlama geldiğini anlamak için bu tablo gerekli aslında c# ta bu bilgileri enum denen sayısal değerlere karşılık gelen senin görmek istediğin rakamlara tutyorlar böylece veritabanında tutmaya yada command yazmaya gerek kalmıyor.
İşini görürü inşallah kolay gelsin..
derviş
ofaruk_k
Üye
Mesajlar: 5
Kayıt: 03 Tem 2007 05:20

Mesaj gönderen ofaruk_k »

çok çok teşekkürler. İstediğim şekilde oldu.
Peki, dersler tablosundaki dersleri otomatik olarak kendi oluşturulabilir mi? Yani teker teker case ifadesi kullanılmayabilir mi? Ayrıca pivot ile kullanımda da bu şekilde teker teker belirtmemiz gerekir mi?
Tekrar çok Teşekürler.
Kolay Gelsin...
Keser döner, sap döner. Gün gelir devran döner...
unalaygun
Üye
Mesajlar: 139
Kayıt: 27 Mar 2004 12:34
Konum: istanbul

Mesaj gönderen unalaygun »

Rica ederim kardeşim hepimiz burda bilmediğimiz şeyleri birbirimizden öğreniyoruz.

pivot ta kullansan bu şekilde belirtmek zorundasın malesef case de kendin yazmalısın yapman gereken zaten dersler o kadar sık değişen bir şey olmasa gerek diye düşünüyorum ama söyle yapabilirsin bu sql delphi ya da ne ile programlama yapıyorsan orada string bir şekilde hazırlarsan
burada tablodan okutursun case li bir halde yani diyeceğim o durki sqlin dinamik bir hale sokmalısın onunn haricinde sql de malesef böyle bi,r yöntem yok ya da en azından ben bilmiyorum.
tekrar kolay gelsin.
derviş
Dovlet
Üye
Mesajlar: 6
Kayıt: 16 Tem 2008 09:39

Re: Tüm Sınıfa Ait Tüm Notların Listesi ?

Mesaj gönderen Dovlet »

iki alana gore pivot yapabilir miyiz.
bende vardiya ve her vardiyada elemanin calistigi toplam saatini aylara gore cikarmak istiyorum.
aylara gore yaptim ama vardiyayi da pivot yapmazsam karisik gozukuyor.

Kod: Tümünü seç

SELECT     SicilNO, VARDIYA, SUM(SURE) AS [AY],
    SUM(CASE WHEN MONTH(TARIH)=1 THEN SURE ELSE 0 END) AS AY1,
    SUM(CASE WHEN MONTH(TARIH)=2 THEN SURE ELSE 0 END) AS AY2,
    SUM(CASE WHEN MONTH(TARIH)=3 THEN SURE ELSE 0 END) AS AY3,
    SUM(CASE WHEN MONTH(TARIH)=4 THEN SURE ELSE 0 END) AS AY4,
    SUM(CASE WHEN MONTH(TARIH)=5 THEN SURE ELSE 0 END) AS AY5,
    SUM(CASE WHEN MONTH(TARIH)=6 THEN SURE ELSE 0 END) AS AY6,
    SUM(CASE WHEN MONTH(TARIH)=7 THEN SURE ELSE 0 END) AS AY7,
    SUM(CASE WHEN MONTH(TARIH)=8 THEN SURE ELSE 0 END) AS AY8,
    SUM(CASE WHEN MONTH(TARIH)=9 THEN SURE ELSE 0 END) AS AY9,
    SUM(CASE WHEN MONTH(TARIH)=10 THEN SURE ELSE 0 END) AS AY10,
    SUM(CASE WHEN MONTH(TARIH)=11 THEN SURE ELSE 0 END) AS AY11,
    SUM(CASE WHEN MONTH(TARIH)=12 THEN SURE ELSE 0 END) AS AY12
FROM         tblPuantaj
GROUP BY SicilNO, VARDIYA, MONTH(TARIH)
ORDER BY MONTH(TARIH)
mesela

Kod: Tümünü seç

sicil_no   ay1 ay2 ay3 ... ay12
================================
v1           14  12  16
v2           15  13  14
v3           16   14  18

gibi her sicil no icin gormek istiyorum.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Tüm Sınıfa Ait Tüm Notların Listesi ?

Mesaj gönderen conari »

o zaman,örnek 1. ay için;

Kod: Tümünü seç

SUM(CASE WHEN MONTH(TARIH)=1 and VARDIYA='v1' THEN SURE ELSE 0 END) AS AY1_VD1,
    SUM(CASE WHEN MONTH(TARIH)=1 and VARDIYA='v2' THEN SURE ELSE 0 END) AS AY1_VD2,
    SUM(CASE WHEN MONTH(TARIH)=1 and VARDIYA='v3' THEN SURE ELSE 0 END) AS AY1_VD3,.............
olarak 3*12 = 36 field yapman lazım.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla