• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

sql serverdan crosstab query yaratmak

Katılım
29 Nisan 2013
Mesajlar
53
Excel Vers. ve Dili
Office 2013, İngilizce
Merhaba arkadaşlar

Arama yaptım ama benzer bir konu bulamadım varsa beni uyarın.

Benim bir access tablom var excelden içine aktardığım ve orda da şöyle değerler var;

Field1 Field11 Field14
aaaa 23 1
bbbb 28 1
cccc 23 2
aaaa 29 3
aaaa 28 2
bbbb 23 1
aaaa 29 3
cccc 29 1

Benim yapmak istediğim;
Field1 23 28 29
aaaa 1 2 6
bbbb 1 1
cccc 2 1


Yani sql server a öyle bir kod yazmalıyım ki field1 ve field11i sütun haline getirip onlara karşılık gelen değerleri toplamalı.Crosstab query ile yapabiliyorum ama bana servera yazmam gereken kod lazım

Yardımcı olursanız çok sevinirim, eğer bu konuyla alakalı bir başlık varsa lütfen beni yönlendirin.
 
USE [DB_PMT_SQL]
SELECT dbo.DLZ_tbl
SUM(CASE WHEN [FNA] = '23' THEN working_days END) AS [23],
SUM(CASE WHEN [FNA] = '28' THEN working_days END) AS [28],
SUM(CASE WHEN [FNA] = '29' THEN working_days END) AS [29],

FROM dbo.DLZ_tbl
GROUP BY DS_No

Sorunu hallettim ama bu sefer de aşağıdaki hatayı veriyor.Sebebi ne olabilir?

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'CASE'.
 
Merhaba,
aşağıdaki şekilde dener misiniz? İyi çalışmalar.

Kod:
SELECT
DS_No,
SUM(CASE WHEN [FNA] = '23' THEN working_days END) AS [23],
SUM(CASE WHEN [FNA] = '28' THEN working_days END) AS [28],
SUM(CASE WHEN [FNA] = '29' THEN working_days END) AS [29]
FROM dbo.DLZ_tbl
GROUP BY DS_No
 
Msg 8117, Level 16, State 1, Line 4
Operand data type nchar is invalid for sum operator.

Bu sefer de bu hatayı verdi
 
Merhaba,
Sql server'da tablonuza benzer bir tabloyu, evdeki notebook'da oluşturup denedim ve örneğinizdeki istediğiniz sonucu aldım. Veri tiplerini farklı oluşturmuş olabilirim. İlgili field'ların veri tiplerini belirtirseniz, akşam test edebilirim.
 
veri tipi derken text,date vs. bundan mı bahsediyorsunuz?
 
Evet, nchar, varchar, real, date vs.
 
hepsi nchar. vaktiniz varsa şimdi bakabilir misiniz?
 
İşyerinde bakamıyorum, sistem evde kurulu. Nchar alanlar dönüştürülmeli. Her toplam alanı aşağıdaki gibi dener misiniz.

Kod:
SUM(CASE WHEN [FNA] = '23' THEN CAST(working_days AS Numeric(10,2)) END) AS [23]
 
Çok teşekkür ederim şimdi çalışıyor eline sağlık.sayenizde nchar ları numeric e dönüştürmem gerektiğini öğrendim :)

as numericten sonraki parantezde(10,2) yazmasının sebebi nedir? sql de yeniyim de her şeyi merak ediyorum
 
Ondalık ayrımının solunda ve sağında kaç adet sayısal değer olması istendiğinin ifadesidir.
 
Son düzenleme:
teşekkür ederim bilgilendirdiğin için :)

peki aynı şekilde tarihleri de sıralamak istersek ve tariherin yazım şekli sırasıyla gg.aa.yyyy şeklinde ise kodda ve veri tipinde nasıl bi değişiklik yapmak gerek?
 
tam olarak anlayamadım. Tarihler nerede yer alıyor, bu sorguyla ilişkisi var mı, sorgu sonucu nasıl olacak? Daha detaylı yazabilirseniz fikir yürütebiliriz.
 
Merhaba arkadaşlar

Arama yaptım ama benzer bir konu bulamadım varsa beni uyarın.

Benim bir access tablom var excelden içine aktardığım ve orda da şöyle değerler var;

Field1 Field11 Field14
aaaa 23 1
bbbb 28 1
cccc 23 2
aaaa 29 3
aaaa 28 2
bbbb 23 1
aaaa 29 3
cccc 29 1

Benim yapmak istediğim;
Field1 23 28 29
aaaa 1 2 6
bbbb 1 1
cccc 2 1


Yani sql server a öyle bir kod yazmalıyım ki field1 ve field11i sütun haline getirip onlara karşılık gelen değerleri toplamalı.Crosstab query ile yapabiliyorum ama bana servera yazmam gereken kod lazım

Yardımcı olursanız çok sevinirim, eğer bu konuyla alakalı bir başlık varsa lütfen beni yönlendirin.


En başta bunu yazmıştım.Şimdi üsteki field1, field11 ve field14ün yanında bir sütun daha olsun ve orada tarihler yer alsın.ve o tabloyu serverda crosstaba çeviren kodu yazdığımda,

Field1 23 28 29 tarih
aaaa 1 2 6 gg.aa.yyyy
bbbb 1 1 gg.aa.yyyy
cccc 2 1 gg.aa.yyyy

olarak versin ama birkaç çeşit değişik tarihlerden max. olanları oraya yazsın
 
Merhaba,
ancak şimdi inceleyebildim. Kodu aşağıdaki gibi değiştiriniz.
İyi çalışmalar.

Kod:
SELECT
DS_No,
SUM(CASE WHEN [FNA] = '23' THEN CAST(working_days AS Numeric(10)) END) AS [23],
SUM(CASE WHEN [FNA] = '28' THEN CAST(working_days AS Numeric(10)) END) AS [28],
SUM(CASE WHEN [FNA] = '29' THEN CAST(working_days AS Numeric(10)) END) AS [29],
convert( varchar, max(tarih), 104) as tarih
FROM dbo.ELZ_tbl
GROUP BY DS_No
 
Merhaba,
Çok teşekkür ederim kod çalışıyor. ama bazı değerlerde max tarihi almıyor.örneğin ikinci değerde max tarihin 23.01.2014 olması gerekirken 31.12.2013 ü alıyor.
Sebebi ne olabilir?
 
31 , 23 den büyük o yüzden :) , formatlardan kaynaklanan bir sorun...alan tipinin DATE olması durumunda MAX tarihe göre çalışacaktır, NUMERIC yada INT olduğunda ise hangi rakam daha büyük ise onu alacaktır...ilk 2 basamağa bakar...
 
31 , 23 den büyük o yüzden :) , formatlardan kaynaklanan bir sorun...alan tipinin DATE olması durumunda MAX tarihe göre çalışacaktır, NUMERIC yada INT olduğunda ise hangi rakam daha büyük ise onu alacaktır...ilk 2 basamağa bakar...
Açıklamayı arkadaş yapmış. Sorun, bizim veritabanınızdaki yapıyı bilmememizden kaynaklanıyor. Data tipi nedir, ona göre bir çözüm bulunabilir.
 
teşekkkür ederim :)

değişikliği yapıyorum ama kaydetmeme izin vermiyor."Saving changes is not permitted....." bir uyarı ekranı çıkıyor.
 
nchar tipinde ama convert edince hallolur sanmıştım
 
Geri
Üst