Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TSQL malo komplikovaniji query

[es] :: MS SQL :: TSQL malo komplikovaniji query

[ Pregleda: 2402 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

surferxyz

Član broj: 45411
Poruke: 55
195.222.35.*



Profil

icon TSQL malo komplikovaniji query08.08.2006. u 08:35 - pre 216 meseci
Zdravo svima.

Problem je sledeći.

Imam tabele (SQL 2000) Poruke(PorukaID, poruka), Statusi(StatusID,status) i StatusiPoruka(PorukaID, StatusID)
Pretpostavimo da imamo ove podatke

Poruke
------------
1 - Poruka1
2 - poruka2


Statusi
-------------------
1 - Status1
2 - Status2
3 - Status3

StatusiPoruka
--------------------
1 - 1
1 - 3
2 - 2

Kako napisati upit da bih dobio sledeći rezultat

PorukeSaStatusim

PorukaID ...... poruka .......... Status1 ........ Status2 ...... Status3
------------- ----------- ------------ ----------- ----------
1 .................. Poruka1 ............. 1 ............. 0 ............. 1
2 .................. poruka2 ............. 0 ............. 1 ............. 0


Nikako ne mogu da savladam Pivot i CrosTable :)


Unaprijed hvala.

PS.
U pitanju je SQL server 2000
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.neobee.net.



+41 Profil

icon Re: TSQL malo komplikovaniji query08.08.2006. u 11:06 - pre 216 meseci
Ne postoji PIVOT u TSQL-u, tako da ti ostaje jedino da dinamicki kreiras SQL u Stored Procedure.

Znaci, treba ti X kolona za X pojava vrednosti statusa - evo kako treba da ti izgleda krajnji SQL za 3 vrednosti statusa, nemam vremena da ti pisem SP koja ce ti ga sastaviti:

Code:

SELECT Poruke.PorukaID, Poruka, Status1, Status2, Status3 
FROM Poruke 
LEFT JOIN (SELECT COUNT(PorukaID) AS Status1, PorukaID FROM StatusiPoruka WHERE StatusID = 1 GROUP BY PorukaID) AS Q1 ON Poruke.PorukaID = Q1.PorukaID 
LEFT JOIN (SELECT COUNT(PorukaID) AS Status2, PorukaID FROM StatusiPoruka WHERE StatusID = 2 GROUP BY PorukaID) AS Q2 ON Poruke.PorukaID = Q2.PorukaID  
LEFT JOIN (SELECT COUNT(PorukaID) AS Status3, PorukaID FROM StatusiPoruka WHERE StatusID = 3 GROUP BY PorukaID) AS Q3 ON Poruke.PorukaID = Q3.PorukaID


pa, analogno ovom gore za 4 vrednosti statusa
Code:

SELECT Poruke.PorukaID, Poruka, Status1, Status2, Status3, Status4 
FROM Poruke 
LEFT JOIN (SELECT COUNT(PorukaID) AS Status1, PorukaID FROM StatusiPoruka WHERE StatusID = 1 GROUP BY PorukaID) AS Q1 ON Poruke.PorukaID = Q1.PorukaID 
LEFT JOIN (SELECT COUNT(PorukaID) AS Status2, PorukaID FROM StatusiPoruka WHERE StatusID = 2 GROUP BY PorukaID) AS Q2 ON Poruke.PorukaID = Q2.PorukaID  
LEFT JOIN (SELECT COUNT(PorukaID) AS Status3, PorukaID FROM StatusiPoruka WHERE StatusID = 3 GROUP BY PorukaID) AS Q3 ON Poruke.PorukaID = Q3.PorukaID 
LEFT JOIN (SELECT COUNT(PorukaID) AS Status4, PorukaID FROM StatusiPoruka WHERE StatusID = 4 GROUP BY PorukaID) AS Q4 ON Poruke.PorukaID = Q4.PorukaID


Nadam se da si na ovo mislio.
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.tippnet.co.yu.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: TSQL malo komplikovaniji query08.08.2006. u 11:17 - pre 216 meseci
Code:

SELECT p.PorukaID, p.Poruka, MAX(s.Status1), MAX(s.Status2), MAX(s.Status3)
  FROM Poruke AS p
       JOIN (SELECT sp.PorukaID,
                    CASE WHEN sp.StatusID = 1 THEN 1 ELSE 0 END AS Status1,
                    CASE WHEN sp.StatusID = 2 THEN 1 ELSE 0 END AS Status2,
                    CASE WHEN sp.StatusID = 3 THEN 1 ELSE 0 END AS Status3
               FROM StatusiPoruka AS sp) AS s
         ON p.PorukaID = s.PorukaID
 GROUP BY p.PorukaID, p.Poruka
 ORDER BY p.PorukaID

PIVOT je samo skraceni nacin zapisivanja gornjeg upita, a ja sam zaboravio kako se koristi :)

Tabela 'Statusi' se u upitu ne koristi. Ako se u tabelu 'Statusi' dodaje nov status onda se i gornji upit mora menjati. Zbog toga se ovakve forme izvestaja prepustaju alatima za generisanje izvestaja.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.neobee.net.



+41 Profil

icon Re: TSQL malo komplikovaniji query08.08.2006. u 11:24 - pre 216 meseci
Da li tebi treba ukupan broj pojava odredjenog statusa po PorukaID ili samo (0, 1)? Ako ti treba ovo prvo onda ti samo moj predlog "radi stvar", a ako je samo 1 ili 0 onda moze i ovo sto ti chachka predlaze. Inace, PIVOT u nekim varijantama SQL-a postoji kao naredba (MS Access Jet npr.).
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.tippnet.co.yu.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: TSQL malo komplikovaniji query08.08.2006. u 11:33 - pre 216 meseci
Ako treba broj pojavljivanja odredjenog statusa onda se umesto MAX stavi SUM
Code:

SELECT p.PorukaID, p.Poruka, SUM(s.Status1), SUM(s.Status2), SUM(s.Status3)
  FROM Poruke AS p
       JOIN (SELECT sp.PorukaID,
                    CASE WHEN sp.StatusID = 1 THEN 1 ELSE 0 END AS Status1,
                    CASE WHEN sp.StatusID = 2 THEN 1 ELSE 0 END AS Status2,
                    CASE WHEN sp.StatusID = 3 THEN 1 ELSE 0 END AS Status3
               FROM StatusiPoruka AS sp) AS s
         ON p.PorukaID = s.PorukaID
 GROUP BY p.PorukaID, p.Poruka
 ORDER BY p.PorukaID

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

surferxyz

Član broj: 45411
Poruke: 55
195.222.35.*



Profil

icon Re: TSQL malo komplikovaniji query08.08.2006. u 11:44 - pre 216 meseci
hvala.

U biti to je to.
Ne znam unaprijed broj statusa, tako da mi upit ne može biti unaprijed predefinisan, al ga mogu dinamički kreitati i izvršiti.
Mislio sam da postoji elegantnije rješenje ovog ptoblem.
U SQL 2005 bi sve bilo puno drugačije.


HVALA.
 
Odgovor na temu

[es] :: MS SQL :: TSQL malo komplikovaniji query

[ Pregleda: 2402 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.