27 Temmuz 2013 Cumartesi

SQL - Pivot Table Nedir Nasıl Kullanılır

MS SQL Server;

Pivot table bir tablodaki verileri yatay olarak göstermemizi sağlar yani satırlarda bulunan bilgileri istediğimiz alanlara göre sutunlara çevirir.  Özellikle rapor hazırlarken verileri daha anlaşılır ve düzenli hale getirmemizi sağlar. Örneğin bir sipariş tablomuz var. Bir müşterinin verdiği her bir sipariş bir satırda gösteriliyor. Her müşteri için son 6 aylık sipariş bilgilerini görmek istiyoruz. Birinci yöntem her hareketi alt alta yazmak olabilir ama daha anlaşılır ve düzenli bir rapor için her müşteri bir satırda yer almalı ve bu satırda son altı aya ait tüm sipariş tutarlarının toplamı gösterilmelidir. Bu durumda pivot table kullanmak imdadımıza yetişir. Bu örneğin daha iyi anlaşılması için küçük bir çalışma yapalım.
İlk olarak basit bir tablo yapalım ve içine aşağıdaki örnek verileri atalım.
CREATE TABLE [dbo].[Siparis](
      [SiparisID] [int] IDENTITY(1,1) NOT NULL,
      [MusteriAdSoyad] [varchar](80) NULL,
      [UrunAdi] [varchar](50) NULL,
      [Tutar] [decimal](10, 2) NULL,
      [Donem] [int] NULL
) ON [PRIMARY]
SiparisIDMusteriAdSoyadUrunAdiTutarDonem
    Sabri KUNTApple IPAD1025201001
    Ali DEMİRLG Netbook950200912
    Metin TOSUNPacketBell Notbook1200200911
    Sabri KUNTNikon D50001480200912
    Sabri KUNTMicrosoft Mouse100200912
    Metin TOSUNHP Printer250200912
    Metin TOSUNHP Server2100200911
    Ali DEMİRHP Pavilion1600200912
   Ali DEMİRADSL Modem80200911
Şimdi müşteri başına aylık olarak ne kadar harcama yapıldığını görmek için bir sorgu yazalım.
SELECT
       MusteriAdSoyad
      ,Donem
      ,sum(Tutar) as ToplamTutar    
  FROM Siparis
  group by MusteriAdSoyad ,Donem
Yukarıdaki sorgu sonucu aşağıdaki gibi her donem için müşterilerin kaç liralık harcama yaptıklarını görürüz.

MusteriAdSoyadDonemToplamTutar
Ali DEMİR20091180
Metin TOSUN2009113300
Ali DEMİR2009122550
Metin TOSUN200912250
Sabri KUNT2009121580
Sabri KUNT2010011025
Peki, bizim binlerce müşterimiz olsa ve toplam 1 yıl boyunca her ay ne kadarlık harcamala yaptıklarını görmek istersek yukarıdaki gibi bir sorgunun sonucunda içinden çıkamayacağımız büyük bir tablomuz olurdu. Her müşteri için aylık harcama miktarlarını farklı satırlarda göstermek hiç de işimize gelmezdi.
Şimdi ise her müşteriyi tek bir satırda gösterelim ve sipariş verdikleri her ay içinde bir kolon açarak bunun altında toplam sipariş tutarlarını gösterelim. Pivot table için Siparis tablosunu gruplayarak kullanmamız gerekiyor. Çünkü sipariş tablosunda her ay için müşteri bazında birden fazla harcama var. Yukarıda yaptığımız gruplamayı yeni bir tablo olarak alıp bunu pivot yaparsak istediğimiz sonuca ulaşabiliriz.
SELECT *
FROM (
      SELECT
       MusteriAdSoyad
      ,Donem
      ,sum(Tutar) as ToplamTutar 
      FROM Siparis
      group by MusteriAdSoyad ,Donem
     ) as gTablo
PIVOT
(
  SUM(ToplamTutar)
  FOR Donem IN ([200911],[200912],[201001])
)
AS p
Yukarıdaki sorgu sonucu aşağıdaki gibi her ay bir kolon olacak şeklide bilgilerimiz yatayda dizildi
MusteriAdSoyad200911200912
Ali DEMİR802550
Metin TOSUN3300250
Sabri KUNTNULL1580

Gördüğünüz gibi bu şeklide bir tablo oluşturmak sonucun daha düzenli olmasını sağladığı gibi incelenmesini kolaylaştırır.

ORACLE;

SELECT ...
FROM   ...
PIVOT [XML]
   ( pivot_clause
     pivot_for_clause
     pivot_in_clause )
WHERE  ...

SQL> WITH pivot_data AS (
            SELECT deptno, job, sal
            FROM   emp
            )
    SELECT *
    FROM   pivot_data
    PIVOT (
               SUM(sal)        --<-- pivot_clause="" span="">
           FOR deptno          --<-- pivot_for_clause="" span="">
          IN  (10,20,30,40)   --<-- pivot_in_clause="" span="">
         );

JOB               10         20         30         40
--------- ---------- ---------- ---------- ----------
CLERK           1430       2090       1045
SALESMAN                              6160
PRESIDENT       5500
MANAGER         2695     3272.5       3135
ANALYST                    6600



16 Temmuz 2013 Salı

C# SQL Üzerinden XML Dosya yaratma

SqlConnection baglanti = new SqlConnection("Server=GENÇAY-GENÇAY;Database=Northwind;Trusted_Connection=True;");
SqlCommand cmd = new SqlCommand("Select * from Personeller",baglanti);

baglanti.Open();

SqlDataReader dr = cmd.ExecuteReader();

XmlTextWriter XMLDosyasi = new XmlTextWriter("Personeller.xml",Encoding.GetEncoding(1254));

//XmlTextWriter nesnesi ile "Personeller.xml" adındaki XML dosyasının nereye olusturulacağını belirledik.
//Encoding.GetEncoding(1254) = Türkçe karakter dil koduna göre XML dosyasını encode etmesini söyledik.

XMLDosyasi.Formatting = Formatting.Indented;

//Formatting özelliği, XML nodelarının girintili yazılacağını belirtir.

XMLDosyasi.WriteStartDocument();

//XML dosyasına yazılmasına başlayacağını bildirdik.

XMLDosyasi.WriteComment("Burada personellerimiz listelenmektedir.");

//Bu metod ile XML dosyamıza yorum(Comment) eklenmesi sağlanır.
//Bundan sonra elemanları yazdırmaya başlayalım...

XMLDosyasi.WriteStartElement("Personeller");

//Bu metod ile XML dosyasının root elemanı belirleniyor.

while (dr.Read())
{
    XMLDosyasi.WriteStartElement("Personel");

    //WriteStartElement() metodu ile yazılan ilk eleman root eleman olur.Daha sonrakiler root un içindeki ana nodelar olur.

    XMLDosyasi.WriteAttributeString("No", dr["PersonelID"].ToString());

    //WriteAttributeString() metodu ile herhangi bir node a Attribute yazılabilir.

    for (int i = 0; i < dr.FieldCount; i++)
    {
        XMLDosyasi.WriteElementString(dr.GetName(i), dr[i].ToString());
        //Node ları getirtiyoruz.
    }

    XMLDosyasi.WriteEndElement();

    //Oluşturulan ana node kapatılıyor.
}

XMLDosyasi.WriteEndElement();

//Root eleman kapatılıyor.

XMLDosyasi.WriteEndDocument();

//XML sayfasının yazma işlevi bitti.

XMLDosyasi.Close();

baglanti.Close();

MessageBox.Show("İşlem Tamamlandı.");

14 Temmuz 2013 Pazar

C# - DataGrid - Binding

private void frmDGV_Load(object sender, EventArgs e)
{
    //dummy data
    List lstStaff = new List();
    lstStaff.Add(new Staff()
    {
        ID = 1,
        Name = "XX"
    });
    lstStaff.Add(new Staff()
    {
        ID = 2,
        Name = "YY"
    });

    
    BindingSource binding = new BindingSource();
    binding.DataSource = lstStaff;

    dataGridView1.DataSource = binding;
}


12 Temmuz 2013 Cuma

ORA-12011 Hata mesajı

09:24:52 Info: Job #565 could not be executed.
ORA-12011: 1 anlık goruntulerini kendiliğinden yenilemeyi basaramadı
ORA-06512: konum "SYS.DBMS_IJOB", satır 651
ORA-06512: konum "SYS.DBMS_JOB", satır 284
ORA-06512: konum satır 1

 Alınan hatanın kaynağı, Job ile çalıştırılmak istenen prosedür veya uygulamanın tanımlı bulunduğu Kullanıcı üzerinden Job ın oluşturulması gerekir. Farklı kullanıcı ile oluşlturulan JOB larda bu hata mesajı alınmaktadır.