select ederken farklı bir karşılaştırma sonucu süzme

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

select ederken farklı bir karşılaştırma sonucu süzme

Mesaj gönderen conari »

Arkadaşlar, sa

Stokhareket tablomdan bir bilgi çekmem lazım,
Yarımamül ve mamül girişlerini karşılaştıracağım
bunun için ancak fiş numarasından yolaçıkabilirim şu an başka bir alternatifim yok.
YM li girişler - 00000000YM62116- şeklinde ki bir numara ile giriliyor
ve bu numaranın "YM"leri çıkarılarak -000000000062116- olarak çıkışı yapılıyor.

Benim istediğim kalan bu YM li stok hareketi;

00000000YM62116 -- Giriş
000000000062116 -- Çıkış
00000000YM62119 -- Giriş
00000000YM62120 -- Giriş
000000000062120 --Çıkış

Burda 00000000YM62119 -- Giriş bu kaydın çıkmadığını görüyorum Bunu sizce nasıl select edebilirim.
Tekrar edeyim başka bir alternatifim yok giriş işlem kaydına sonra dan çıkışı yapıldı gibi bir değer giremiyorum.(vt bana ait değil)

Teşekkürler
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Kod: Tümünü seç

SELECT COPY(11,5) AS HAREKETKODU,
CASE WHEN COPY(9,2)='YM' THEN GIRIS ELSE CIKIS END AS HAREKETTIPI
FROM STOKHAREKET
ORDER BY HAREKETKODU
Anladığım kadarıyla böyle birşey...
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Burda nasıl bir kıyaslama yaptığını anlayamadım açıkçası :roll:
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

00000000YM62116 -- Giriş
000000000062116 -- Çıkış
00000000YM62119 -- Giriş
00000000YM62120 -- Giriş
000000000062120 --Çıkış
bu kodla 'giriş' ve 'çıkış' etiketlerini kayıdın yanına ekler. Siz bu sorgu sonucu dönen sonuç kümesiyle istediğiniz herşeyi yapabilirsiniz.
siz çıkışı yapılmamış girişleri mi görmek istiyorsunuz?
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

sadece çıkışı yapılmamışları istiyorum .

fakat bu sorguda çıkmış olduğunu nasıl yakaladın anlayamadım doğrusu

00000000YM62116 -- Giriş bunun yanına Giriş yazması bir şeyi ifade etmiyor bu zaten biliniyor bu formdan 000000000062116 şeklinde olan varmı diye ayrıca bakması lazım.

tablom için bir örnek vereyim sorguyu oluşturabilirsen bir deneyim

stokkodu, fisno,tarih, g_c, miktar,........................
xxx, 0000000000YM62116, G, 01.01.2007,150
xxx, 00000000000062116, C, 02.01.2007,150
xxx, 0000000000YM62117, G, 02.01.2007,150
xxx, 0000000000YM62118, G, 02.01.2007,400
xxx, 0000000000YM62119, G, 03.01.2007,350
xxx, 00000000000062118, C, 04.01.2007,400

bu kayıtlara göre
xxx, 0000000000YM62117, G, 02.01.2007,150
xxx, 0000000000YM62119, G, 03.01.2007,350

bu iki kaydı listelemem lazım.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

SELECT COPY(13,5) AS HAREKETKODU,
CASE WHEN COPY(11,2)='YM' THEN GIRIS ELSE CIKIS END AS HAREKETTIPI
FROM STOKHAREKET
ORDER BY HAREKETKODU
buradan bir katikulli ile
select hareketkodu,count(*)
(
SELECT COPY(13,5) AS HAREKETKODU,
CASE WHEN COPY(11,2)='YM' THEN GIRIS ELSE CIKIS END AS HAREKETTIPI
FROM STOKHAREKET
ORDER BY HAREKETKODU) as tmp
GROUP BY hareketkodu
HAVING count(*)=1
bu istediğini verir...
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Alan değerleri tamamen verdiğin örnekteki gibi ise fazla uğraşmadan direk ISNUMERIC fonksiyonu ile istediğini yapabilirsin. Örnek:

Kod: Tümünü seç

SELECT * FROM STOK WHERE ISNUMERIC(STOK_KODU) = 1
Bu fonksiyon sayısal değerler için 1, sayısal olmayanlar için 0 değeri döndürüyor. Giriş-Çıkış ayrımını buradan yapabilirsin.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

copy için bu hatayı alıyorum,

Kod: Tümünü seç

'COPY' is not a recognized built-in function name.
MSSQL2005 kullanıyorum.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

Sql Server bu fonksiyonu destekliyor. Hatta ben sürekli kullanıyorum. Sql server'ın kendi sorgulama editöründe denedin mi?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

COPY yerine SUBSTRING dene, kullanımına örnek helpten bakabilirsin.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

SQL Server Management Studio 'dan deniyorum.
Program içinden değil.

bir kaç gün önce sorduğum gibi,
Compatibility Level ayarının (80) (90) farkından kaynaklanabilirmi bu fonksiyonu kullanabilmem için
data 2000 olarak gözükmekte.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

substring kullanarak denedim.

fisnumarasını sondan 5 hanelerini ayırıp, saydırıp sonrada =1 olanlar diye ama group by istiyo fisnoya böyle oluncada her fişnoyu tek tek döküyor ve her kayıt 1 dönüyor, tüm fişler geliyor.
pöfffff

Kod: Tümünü seç

select stok_kodu, SUBSTRING(fisno,11,5),
count(SUBSTRING(fisno,11,5))
FROM stokhareket 
GROUP BY stok_kodu,fisno
HAVING count(SUBSTRING(fisno,11,5))=1 
order by SUBSTRING(fisno,11,5)
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Şöyle birşey düşündüm: Giriş hareketlerinde fişnumarasında YM geçen yere 00 koyarak yeni fiş numarası oluştur bu fiş numaraları çıkış olanların içinde olmayanları getir.

Kod: Tümünü seç

SELECT *
FROM HAREKET
WHERE SUBSTRING(fisno,1,PATINDEX('%YM%',fisno)-1)+'00'+SUBSTRING(fisno,PATINDEX('%YM%',fisno)+2,LEN(fisno))
NOT IN (SELECT fisno FROM HAREKET WHERE G_C='C')
AND  G_C = 'G'
Aşağıdaki kodla 0000000000YM62117 --> 00000000000062117
yapılır.
SUBSTRING(fisno,1,PATINDEX('%YM%',fisno)-1)+'00'+SUBSTRING(fisno,PATINDEX('%YM%',fisno)+2,LEN(fisno))

SUBSTRING(fisno,1,PATINDEX('%YM%',fisno)-1): fiş numarasının baş kısmını YM bulunan yere kadar al
+'00': YM geçen yere 00 ekle
+SUBSTRING(fisno,PATINDEX('%YM%',fisno)+2,LEN(fisno)): fiş numarasının YM den sonraki kısmını sonuna kadar al
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

İlgin için Teşekkürler,
fakat aldığım hata mesaj aşağıda
:cry: :(

Kod: Tümünü seç

Invalid length parameter passed to the SUBSTRING function.
Kodu aynen denedim
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Giriş olupta içinde YM geçmeyen fiş numaraları var mı? Bazı fiş numaralarında YM yi bulamadığı için substring içinde 1 den 0 a kadar almaya çalışıyor ve bu yüzden hata veriyor.
Cevapla