En iyi yanıtlayıcılar
CASE WHEN Yapısında Null olan sonuçları sıfıra çevirme

Soru
-
Merhaba,
MERKEZ_STOK ve IADE_STOK alanlarına gelen sonuçlardan NULL olanları sıfır veya boşluk ile değiştirmek istiyorum.
Aşağıdaki sorguda denedim ama yine boş olanlara NULL yazıyor.
SELECT PRODUCT_ID,UR.EXT_CODE, UR.NAME, CASE WAREHOUSE_ID WHEN 3 THEN ISNULL(QUANTITY,0) END AS MERKEZ_STOK , CASE WAREHOUSE_ID WHEN 1 THEN ISNULL(QUANTITY,0) END AS IADE_STOK, TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY > 0
Yanıtlar
-
SELECT PRODUCT_ID,UR.EXT_CODE, UR.NAME, CASE WAREHOUSE_ID WHEN 3 THEN ISNULL(QUANTITY,0) ELSE 0 END AS MERKEZ_STOK , CASE WAREHOUSE_ID WHEN 1 THEN ISNULL(QUANTITY,0) ELSE 0 END AS IADE_STOK, TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY > 0
- Yanıt Olarak Öneren Soner KOYLU 17 Ekim 2015 Cumartesi 14:47
- Yanıt Olarak İşaretleyen Serkan Canseven 19 Ekim 2015 Pazartesi 07:07
Tüm Yanıtlar
-
SELECT PRODUCT_ID,UR.EXT_CODE, UR.NAME, CASE WAREHOUSE_ID WHEN 3 THEN ISNULL(QUANTITY,0) ELSE 0 END AS MERKEZ_STOK , CASE WAREHOUSE_ID WHEN 1 THEN ISNULL(QUANTITY,0) ELSE 0 END AS IADE_STOK, TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY > 0
- Yanıt Olarak Öneren Soner KOYLU 17 Ekim 2015 Cumartesi 14:47
- Yanıt Olarak İşaretleyen Serkan Canseven 19 Ekim 2015 Pazartesi 07:07
-
-
Peki Merkez stok ve İade Stoğu tek satır üzerinde nasıl gösterebiliriz.
Aynı ürün için hem merkez stok varsa hemde iade stok varsa ikisinide farklı satırda gösteriyor.
ürün kodu Merkez Stok İade Stok 101201 1050 0 101201 0 15
gibi gösteriyor.
Oysaki ben
ürün kodu Merkez Stok İade Stok 101201 1050 15
şeklinde istiyorum.
- Düzenleyen TuranBozbek 19 Ekim 2015 Pazartesi 10:34
-
-
-
Hocam aşağıdaki kod ile açtığım konu başlığı çözülüyor ama iş konu başlığı dışına çıktı.
sonucu yukarıda yazdığım gibi alıyorum. Ben tek satırda Merkez stok ve iade stoğu görüntülensin istiyorum.
SELECT PRODUCT_ID,UR.EXT_CODE, UR.NAME, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END MERKEZ_STOK, CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END IADE_STOK, TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY > 0 ORDER BY EXT_CODE
-
Ben de diyorum ki, gercek sonuclarin tamamini gorebilseydik fikrimiz olurdu. Bana sanki olmayacak bir seyin pesindeymissin gibi geldi. Orada gosterdigin kolonlar disinda, gostermedigin EXT_CODE, NAME, TIME gibi kolonlar var. O kolonlarin icerigi eger her ikisinde de ayni ise o zaman basitce bunu SUM() sorgusu seklinde yazarsin olur biter:
SELECT TR.PRODUCT_ID, UR.EXT_CODE, UR.NAME, SUM(CASE WHEN WAREHOUSE_ID = 3 THEN QUANTITY ELSE 0 END) AS MERKEZ_STOK, SUM(CASE WHEN WAREHOUSE_ID = 1 THEN QUANTITY ELSE 0 END) AS IADE_STOK, [TIME] FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID = UR.ID GROUP BY TR.PRODUCT_ID, UR.EXT_CODE, UR.NAME, [TIME] ORDER BY EXT_CODE;
Not: IsNULL() basliga uymus ama gereksiz zaten.
- Düzenleyen CetinBasoz 19 Ekim 2015 Pazartesi 14:10
-
Hocam işin içinden çıkamadım. Sonuç bu.
527455 101001013 aaaaaaaa 0.000000 7.000000 2015-10-10 12:18:15.297 527455 101001013 aaaaaaaa 115.000000 0.000000 2015-10-15 16:56:29.880 627957 101001020 bbbbbbbb 49.000000 0.000000 2015-10-09 15:25:49.683 2546 101001030 cccccccc 0.000000 2.000000 2015-10-03 16:10:37.380 2546 101001030 cccccccc 88.000000 0.000000 2015-10-15 16:56:29.880
İki Tablo var. Tablonun birinde (PRODUCT_WAREHOUSE_STOCK) Stokların son halleri derlenmiş bir tablo var. Bu tabloda kullandığım alanlar
PRODUCT_ID Her bir ürünü temsil ediyor. Örneğin 1646 ıd li ürünü çağırdığımda 3 satır sonuç geliyor. bu satırların biri merkez stoğu, biri iade stoğunu temsil ediyor.
Bu bilgilerde WAREHOUSE_ID alanında saklı 3, 2 ve 1 rakamlarından ibaret.
3 rakamının olduğu satır merkez stoğu ifade ediyor stok mitarıda QUANTITY sütununda bulunuyor.
1 rakamı da İade stoğunu ifade ediyor oda yine QUANTITY sütununda saklanıyor.
2 no yu bilmiyorum kullanmıyorum zaten.
Diğer tabloda (PRODUCT) ise EXT.CODE ürün kodunun bulunduğu alan, NAME ürün adının bulunduğu alan.
bu tabloların birbiri ile ilişkisi PRODUCT_WAREHOUSE_STOCK.PRODUCT_ID = PRODUCT.ID şeklindedir.
yazdığımız kodda ters olan nedir çözemedim.
- Düzenleyen TuranBozbek 19 Ekim 2015 Pazartesi 19:21
-
Tablolarin yapilarini ve ornek datayi kod olarak verirsen bakalim. Kod seklinde vermek icin SQLFiddle ya da T-SQL Flex kullanabilirsin.
-
Peki Merkez stok ve İade Stoğu tek satır üzerinde nasıl gösterebiliriz.
Aynı ürün için hem merkez stok varsa hemde iade stok varsa ikisinide farklı satırda gösteriyor.
ürün kodu Merkez Stok İade Stok 101201 1050 0 101201 0 15
gibi gösteriyor.
Oysaki ben
ürün kodu Merkez Stok İade Stok 101201 1050 15
şeklinde istiyorum.
oncelikle soruya bir id degeri vermelisin
cunki sonucda dublicate sonucla karsilasicaksin ve case de else sartina bir soru daha ekliyceksin yani sql bize bu imkanlari verir
ben senin tablonun kolonlarini ve iceriklerini bilmediim icin yeni tablo yaratdim ve sonucu rahatlikla aldim
modele bakib kendi projende rahatlikla sonuca vara bilirsin
create table t1 (id int not null identity(1,1), urun int, merkezstock int, iade_stock int) insert into t1 (urun,merkezstock,iade_stock) select 102201,1050,0 union all select 102201,0,15 select*from t1; with tabl (id,[urun],[merkezstock],[iade_stock]) as( select id,[urun]=case when urun <>0 then urun else (select urun from t1 where urun<>0) end , [merkezstock]=case when merkezstock <> 0 then merkezstock else (select merkezstock from t1 where merkezstock<>0) end , [iade_stock]=case when iade_stock <> 0 then iade_stock else (select iade_stock from t1 where iade_stock<>0) end from t1 ) select max(id),[urun],[merkezstock],[iade_stock] from tabl group by [urun],[merkezstock],[iade_stock] drop table t1 (2 row(s) affected) id urun merkezstock iade_stock ----------- ----------- ----------- ----------- 1 102201 1050 0 2 102201 0 15 (2 row(s) affected) urun merkezstock iade_stock ----------- ----------- ----------- ----------- 2 102201 1050 15 (1 row(s) affected)
-
-
@Natig Gurbanov,
Bu dogru bir yontem olmamis. Mesela sadece t1 insert kismini degistirip deneyin:
INSERT INTO t1( urun, merkezstock, iade_stock ) VALUES ( 102201, 1050, 0 ), ( 102201, 0, 15 ), ( 102202, 1050, 0 ), ( 102202, 0, 15 );
oncelikle dikkatiniz icin tesekkurler
problemin ismini Case koydugu icin degerli kardesim bende o yuzden
Case in gucunu gostermek istedim
ama hata
Msg 512, Level 16, State 1, Line 19
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
olduuna gore benim tavsiyem bu tur konularin cozumunu Case de aramamasidir ,sql 2005 den sonra zaten cross apply yi onermis microsoft ama ben yine de vizual tablolara deger veriyorum
sizin bana sundugunuz verileri insert edib cok rahatlikla neticeyi elde bilirsiniz
create table t1 (id int not null identity(1,1), urun int, merkezstock int, iade_stock int) INSERT INTO t1( urun, merkezstock, iade_stock ) VALUES ( 102201, 1050, 0 ), ( 102201, 0, 15 ), ( 102202, 1050, 0 ), ( 102202, 0, 15 ); select*from t1 with ct1 as ( select urun as urun1 ,merkezstock as merkezstock1 ,iade_stock as iade_stock1 from t1 where merkezstock<>0) , ct2 as ( select urun as urun2 ,merkezstock as merkezstock2 ,iade_stock as iade_stock2 from t1 where iade_stock<>0) select ct1.urun1,ct1.merkezstock1,ct2.iade_stock2 from ct1 left join ct2 on ct1.urun1=ct2.urun2 drop table t1 id urun merkezstock iade_stock ----------- ----------- ----------- ----------- 1 102201 1050 0 2 102201 0 15 3 102202 1050 0 4 102202 0 15 (4 row(s) affected) urun1 merkezstock1 iade_stock2 ----------- ------------ ----------- 102201 1050 15 102202 1050 15 (2 row(s) affected)
-
Sayın Natig Gurbanov hocam öncelikle ilginize teşekkürler.
Id vermek sorunu çözmedi sanırım. Bir sonraki örneğinize göre uyarladım. Ancak sonuç değişmedi.
Ben şu şekilde yapmıştım. Burada değeri sıfır olmayan Merkez stokların hepsini listeliyorum ve yanınada iade stoklarını listeliyorum. Ancak Merkez stok sıfır olan ürünlerde iade var ise bu seferde onları listeleyemiyorum.
WITH IAD AS (SELECT PRODUCT_ID, QUANTITY FROM PRODUCT_WAREHOUSE_STOCK AS TR WHERE WAREHOUSE_ID=1 AND QUANTITY > 0) SELECT TR.PRODUCT_ID,EXT_CODE,NAME,TR.QUANTITY, IA.QUANTITY,TR.TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS PR ON TR.PRODUCT_ID=PR.ID LEFT JOIN IAD AS IA ON IA.PRODUCT_ID=PR.ID WHERE WAREHOUSE_ID=3 AND TR.QUANTITY > 0 ORDER BY EXT_CODE
Sizin örneğinize uyarladığım da aşağıdaki gibi. Ama dediğim gibi sonuç alamadım. Sizin örneğinizle ilişkilendirdiğinizde Az çok kodlardan anlarsınız ne yapmak istediğimi. Sizin son örneğinizdeki sonucu bulmaya çalışıyorum. Ama olmuyor.
WITH MRK AS (SELECT PRODUCT_ID,UR.EXT_CODE AS KOD1, UR.NAME AS NAME1, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK1 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK1 FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0), IAD AS ( SELECT PRODUCT_ID,UR.EXT_CODE AS KOD2, UR.NAME AS NAME2, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK2 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK2 FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0) SELECT MRK.KOD1, MRK.NAME1,MRK.MERKEZ_STOK1 ,IAD.IADE_STOK2 FROM MRK LEFT JOIN IAD ON MRK.KOD1=IAD.KOD2
- Düzenleyen TuranBozbek 28 Ekim 2015 Çarşamba 08:58
-
Sanirim soruna cok yuzeysel bakiyorsunuz. Oncelikle, yukarida anlatmaya calistigim gibi, cozumu olmayabilir. Orijinal soruya bakarsaniz, cozumu yok gibi, unique olmayan cok sayida kolon var ve buna ragmen onlarin nasil 2 satira indirilecegi karanlik. Ornek tablolar ve veri olmadigi icin de bu soru tikandi.
Sizin verdiginiz cozum yeni bir bandaj ve rahatlikla bozuluyor. Ornegin:
INSERT INTO t1 ( urun, merkezstock, iade_stock ) VALUES ( 102201, 1050, 0 ), ( 102201, 0, 15 ), ( 102202, 1000, 0 ), ( 102202, 1050, 0 ), ( 102202, 0, 15 );
Daha bu tabloda o code, name, time kolonlari yok bile. Isin icine o kolonlar girince bozuluyor zaten is. Yoksa CTE'ye bile gerek yok 20 yil onceki SQL databaselerde bile gecerli olan bir group by + sum() ile biterdi is.
-
-
Ya ben neden cozumu yok diye dusunuyorum sana soyleyeyim, herhalde bastan beri anlasilmadi. Soyle bir sonuc varsa (tablo yapilari ve ornek veriyi hep gizlediginden olup olamayacagini bilemiyoruz, sadece hayal gucumuze kaliyor) :
PRODUCT_ID, EXT_CODE, NAME, MERKEZ_STOK , IADE_STOK, TIME ----------- -------- ----- ----------- --------- ------- 1 1 P1 1000 0 2015/1/1 1 1 P1 0 150 2015/1/1 1 1 P1 2000 0 2015/2/1 1 1 P1 0 250 2015/2/1 1 2 P12 3000 0 2015/1/1 1 2 P12 0 350 2015/1/1
Bunun cevabi elinde kagit kalem olsa ne olacak. Sorun burada.
-
Hocam en iyisi ben size 2 ayrı tablonun da kod ile örneğini oluşturarak göndereyim. Birde o şekilde bakın isterseniz.
Eğer bu veri tabanından programa rapor halinde çekebiliyorsa yazılımcılar, burada da mümkün olmalı diye düşünüyorum.
Tablo yapıları ve kodları aşağıdaki gibidir. Sonuç olarak her ürün çeşidi 1 satır yer kaplamalıdır.
create table stoklar (ID int not null identity(1,1), WAREHOUSE_ID int, PRODUCT_ID int, QUANTITY int) INSERT INTO stoklar( WAREHOUSE_ID, PRODUCT_ID, QUANTITY ) VALUES ( 3, 20, 110 ), ( 2, 20, 0 ), ( 1, 20, 15 ), ( 3, 21, 0 ), ( 2, 21, 0 ),( 1, 21, 13 ), ( 3, 22, 187 ),( 2, 22,0 ),( 1, 22, 3 ), ( 3, 23, 160 ), ( 2, 23, 0 ),( 1, 23, 0 ), ( 3, 24, 205 ), ( 2, 24, 0 ),( 1, 24, 0 ) create table urunler (IDI int not null identity(1,1), ID int, EXT_CODE int, NAME Char(20)) INSERT INTO urunler( ID, EXT_CODE, NAME ) VALUES ( 21, 10110, 'A urunu' ), ( 20, 10211, 'B urunu' ), ( 22, 10215,'C urunu' ), ( 23, 10331, 'D urunu' ), ( 24, 10452,'E urunu' ) WITH MRK AS (SELECT PRODUCT_ID,UR.EXT_CODE AS KOD1, UR.NAME AS NAME1, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK1 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK1 FROM stoklar AS TR INNER JOIN urunler AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0), IAD AS ( SELECT PRODUCT_ID,UR.EXT_CODE AS KOD2, UR.NAME AS NAME2, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK2 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK2 FROM stoklar AS TR INNER JOIN urunler AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0) SELECT MRK.KOD1, MRK.NAME1,MRK.MERKEZ_STOK1 ,IAD.IADE_STOK2 FROM MRK LEFT JOIN IAD ON MRK.KOD1=IAD.KOD2 drop table stoklar drop table urunler
Vay be bu arada hem tabloları yazabildim hem tabloların verisinden tablo çektim. :)
- Düzenleyen TuranBozbek 28 Ekim 2015 Çarşamba 12:02
-
Sayın Natig Gurbanov hocam öncelikle ilginize teşekkürler.
Id vermek sorunu çözmedi sanırım. Bir sonraki örneğinize göre uyarladım. Ancak sonuç değişmedi.
Ben şu şekilde yapmıştım. Burada değeri sıfır olmayan Merkez stokların hepsini listeliyorum ve yanınada iade stoklarını listeliyorum. Ancak Merkez stok sıfır olan ürünlerde iade var ise bu seferde onları listeleyemiyorum.
WITH IAD AS (SELECT PRODUCT_ID, QUANTITY FROM PRODUCT_WAREHOUSE_STOCK AS TR WHERE WAREHOUSE_ID=1 AND QUANTITY > 0) SELECT TR.PRODUCT_ID,EXT_CODE,NAME,TR.QUANTITY, IA.QUANTITY,TR.TIME FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS PR ON TR.PRODUCT_ID=PR.ID LEFT JOIN IAD AS IA ON IA.PRODUCT_ID=PR.ID WHERE WAREHOUSE_ID=3 AND TR.QUANTITY > 0 ORDER BY EXT_CODE
Sizin örneğinize uyarladığım da aşağıdaki gibi. Ama dediğim gibi sonuç alamadım. Sizin örneğinizle ilişkilendirdiğinizde Az çok kodlardan anlarsınız ne yapmak istediğimi. Sizin son örneğinizdeki sonucu bulmaya çalışıyorum. Ama olmuyor.
WITH MRK AS (SELECT PRODUCT_ID,UR.EXT_CODE AS KOD1, UR.NAME AS NAME1, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK1 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK1 FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0), IAD AS ( SELECT PRODUCT_ID,UR.EXT_CODE AS KOD2, UR.NAME AS NAME2, CASE WAREHOUSE_ID WHEN 3 THEN QUANTITY ELSE 0 END AS MERKEZ_STOK2 , CASE WAREHOUSE_ID WHEN 1 THEN QUANTITY ELSE 0 END AS IADE_STOK2 FROM PRODUCT_WAREHOUSE_STOCK AS TR INNER JOIN PRODUCT AS UR ON TR.PRODUCT_ID=UR.ID WHERE QUANTITY <> 0) SELECT MRK.KOD1, MRK.NAME1,MRK.MERKEZ_STOK1 ,IAD.IADE_STOK2 FROM MRK LEFT JOIN IAD ON MRK.KOD1=IAD.KOD2
Degerli kardesim ,bence siz sql in en zaif yerlerine daldiniz ,
ben zaten yukarida yazdim
case le bu tur sorularini cozmek isterseniz buyu sorunlarla karsilasirsiniz
ortda cozulmuyecek bir sorun yok
ben zaten model atdim size
problem su
sum() istemiyorsunuz sadece rakamlar olmali
1)with kullanarak tablonu parcaliyicaksin ---tabii ki sana lazim olan sartlarla(0 deger vermeyen)
ve her yaratdigiin with table de join icin urun id olmali cunki tek sifir almayan deyer o senin tabloda
2)urun id ye gore (ya da senin tabloda baska bir kolonla) tablolarini birlestiriceksin left join le
ve ilave olarak sql2005 den bu yana bu turlu problemler icin Apply fonksiyonunu kullana bilirsin
yok eger bas edemiyorsan
tablolarini select top 5 le 5 satiriini kopyala suraya at hazir skripti gotur
cunki
bir millet iki devletiz
-
Turan,
Tablo yapilarin garip. Bu yapilar ile ve verdigin kirpilmis veri ile tahmin yuruterek cikardigim SQL, sana zaten en basta verdigim SQL:
SELECT PRODUCT_ID, EXT_CODE, NAME, SUM(CASE WHEN WAREHOUSE_ID = 3 THEN QUANTITY ELSE 0 END) AS MERKEZ_STOK, SUM(CASE WHEN WAREHOUSE_ID = 1 THEN QUANTITY ELSE 0 END) AS IADE_STOK FROM stoklar AS TR INNER JOIN urunler AS UR ON TR.PRODUCT_ID = UR.ID WHERE QUANTITY > 0 GROUP BY PRODUCT_ID, ext_code, name ORDER BY PRODUCT_ID;
Sen bu tablolarda [TIME]'i kullanmamissin. Sana dedigim gibi o isi bozar, ondan mumkun degil demistim.
-