Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL]Problem z zapytaniem SQL
Bolo1991
post 30.11.2019, 09:41:31
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Witam,
Jako że jestem na początku drogi z SQL, mam pytanie w sprawie jednego zapytania:
Kod
select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where product_doc.tag_production not like '' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc


Wszystko niby fajnie pokazuje, lecz pokazuje mi wartości puste z jednej kolumny mimo że rozgraniczyłem, żeby nie pokazywać. Proszę o doradzenie co robię źle.
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 09:50:13
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A możesz wskazać gdzie zawarłeś ten warunek?


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 09:59:15
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Kod
where product_doc.tag_production not like ''
Go to the top of the page
+Quote Post
nospor
post 30.11.2019, 10:06:35
Post #4





Grupa: Moderatorzy
Postów: 36 447
Pomógł: 6292
Dołączył: 27.12.2004




A jestes pewien ze tam sa puste teksty? Moze tam sa NULLe ?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 10:08:42
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To teraz zastanów się co zwraca:

  1. REPLACE(product_doc.tag_production,'DRZ','')


i czy Twój warunek zostanie spełniony dla tej kolumny.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 10:14:05
Post #6





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Nulli nie ma bo sprawdzałem,
No ten warunek ma zamieniać wartość "DRZ' na puste, bo nie które znaki muszę zamieniać na puste, żeby ich nie pokazywać, a potem chce nie pokazywać pustych smile.gif
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 10:16:10
Post #7





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Ten warunek nic nie zamienia, bo to nie warunek.

Nie sądzisz, że operujesz na "surowej" wartości w warunku, a wyświetlasz przetworzoną? Jednym słowem Twój warunek ma się nijak, do kolumny Tag.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 10:18:45
Post #8





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


No ok, czyli rozumiem że to rozwiązanie jest złe, a jakie jest poprawne ? Po proszę o naprowadzenie.
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 10:19:18
Post #9





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Warunek należy założyć na przetworzonej kolumnie.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 11:16:53
Post #10





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Rozumiem i nie rozumiem smile.gif , czyli w tym selecie ma tego nie być a ma być where ?
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 11:24:24
Post #11





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Niezoptymalizowne rozwiązanie, to takie, że przenosisz całą wyliczaną kolumnę do WHERE (i porównujesz z ''), bo chcesz się pozbyć pustych wartości po przetworzeniu, a nie na "surowej" kolumnie.

A gdy to zrobisz, to zauważysz, że nie ma sensu wyliczanie tej kolumny (cała ta gąsienica z REPLACE), bo i tak chcesz się pozbyć wierszy z '', co się sprowadza do warunku:
  1. product_doc.tag_production<>'DRZ' AND product_doc.tag_production<>'LAK' ... itd.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 11:36:49
Post #12





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


No tak jest to zrozumiałe i działające w przypadku gdy w kolumnie jest tylko jedna wartość i sobie mogę ją wykluczyć, ale co w przypadku gdy mam 3 wartości i chce wykluczyć 2 a jedną zostawić ?



Np chce zostawić tylko wartość BRO, a reszta ma się nie pojawiać obok.
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 11:40:24
Post #13





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To wtedy pozostaje tylko ta pierwsza opcja.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 14:35:39
Post #14





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Yh czyli pierwszy który?
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 15:16:04
Post #15





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W poście #11 są dwa. Pierwszy to ten pierwszy.


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 19:56:25
Post #16





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


No dupa smile.gif Nie działa, zapis teraz wygląda tak, o ile teraz nie pokazuje mi pustych to za chiny ludowe nie mogę usunąć np 'DRZ'.
Kod
    select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(product_doc.tag_production,'*',' ') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where product_doc.tag_production not like '' And product_doc.tag_production <> 'DRZ' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc
Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 20:15:46
Post #17





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. WHERE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') <> ''


--------------------
Go to the top of the page
+Quote Post
Bolo1991
post 30.11.2019, 20:54:27
Post #18





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 30.11.2019

Ostrzeżenie: (0%)
-----


Dzięki, ale efekt nie jest taki jak być powinien :
Kod
    select doc.doc_user_number As [Numer Umowy],product_doc.order_number As [Pozycja],product_doc.quantity As [Ilość sztuk],replace(product_doc.tag_production,'*',' ') As [Tag]
,Production_line.production_line_type As [Linia],doc.doc_status_id As [Status Umowy],doc.doc_delivery_date As [Data wyjazdu], replace(replace(replace(replace(replace(replace(replace(replace(doc.tag_feature,'*1:',''),'*2:',' '),'MD',''),'AD',''),'ELEG',''),'88',''),'HS',''),'*','') As [Kolor]                        
from [PAM_TEST].dbo.doc
join dbo.doc_status on doc_status.id = doc.doc_status_id
join dbo.Production_line on Production_line.branch_id = doc.branch_id
join dbo.product_doc on product_doc.doc_id = doc.id
  where REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(product_doc.tag_production,'DRZ',''),'LAK',''),'POS',''),'NPR',''),'*',''),'HS',''),'HKS',''),'LUK',''),'SKOS',''),' ','') <> '' And doc.tag_feature not like '' And doc.tag_feature not like '%2K:%' And doc.tag_feature not like '%1S:%' And doc.doc_status_id = 7 And Production_line.production_line_type  = -2
  group by Production_line.production_line_type, doc.doc_user_number, doc.doc_status_id, doc.doc_delivery_date, doc.tag_feature,product_doc.tag_production, product_doc.order_number,product_doc.quantity
  order by doc.doc_delivery_date asc


Rezultat:

Go to the top of the page
+Quote Post
trueblue
post 30.11.2019, 22:11:57
Post #19





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W SELECT zostawiasz tak jak było na początku. Zmieniasz tylko warunek w klauzuli WHERE na ten, który podałem. Teraz w WHERE jest ok, ale popsułeś w SELECT.
W SELECT i WHERE ma być ta gąsienica.

Inne rozwiązanie, to owinąć pierwotne zapytanie, a warunek (na tej przeliczonej kolumnie Tag) przenieść do zewnętrznego SELECT.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 17:45