[ vecitiKrivac @ 24.08.2005. 14:04 ] @
Imam tabelu apartman koja izgleda ovako
create table apartman (
apartmanid smallint(2) not nul primary key,
broj_sobe smallint(2) not null,
broj_kreveta smallint not null,
terasa char(10) not null,
klima char(10) not null,
tv char(10) not null,
mini_bar char(10) not null,
fen char(10) not null,
frizider char(10) not null,
hotelid smallint(2) not null,
foriegn key (hotelid) references hotel (hotelid)
);
Zeleo bih da postavim jedan upit koji ce mi vratiti npr. broj apartmana koji imaju tv, broj apartmana koji imaju terasu i broj apartmana koji imaju mini_bar. Da li je to u opste moguce ili moram zasebno da pravim upite , ako jeste kako da ih grupisem jer sam pokusavao i dobi sam rezultate koje nisam hteo. Pokusaji su licili na ovako nesto.
select count(terasa), count(tv), count(mini_bar) from apartman where hotelid='122' group by teresa and tv;
hotelid 122 je sifra za hotel koja se nalazi u tabeli hotel, unapred hvala.
[ Milovan_B @ 24.08.2005. 17:11 ] @
Nadam se da ce ti ovo pomoci,

SELECT HotelID,
Koliko_apartmana = count( ApartmanID ),
Koloko_terasa = count( terasa ),
Koliko_televizora = count( tv ),
Koliko_mini_barova = count( mini_bar )
FROM apartman
WHERE hotelid='122'
GROUP BY HotelID
HAVING Koliko_apartmana > 0

Pozdrav,
Milovan

[ jablan @ 25.08.2005. 07:45 ] @
Ovo teško da će moći, s obzirom da su mu polja po kojima radiš COUNT sva NOT NULL.

Možda će morati da radi nešto tipa sum(case terasa when 'da' then 1 else 0 end)
[ Milovan_B @ 25.08.2005. 14:26 ] @
Jablane,

Uzmi bilo koju sql knjigu i stavi ispod jastuka pre nego sto zaspis. Kakve veze ima NULL sa agregacijom pobogu. Pre nego sto nesto napises 'izmeri pa odseci' . Nije fer prema ljudima koji citaju ovaj forum da bi nasli SQL Server informacije a ti ih bombardujes sa glupostima. Evo ti primer da upit sa agregacijom koji sam prilozio radi. I to je jedini nacin da pravis agregacije (normalno ako ne koristis cursor - sto nije pozeljno):

CREATE TABLE [apartman] (
[apartmanid] [smallint] NOT NULL ,
[broj_sobe] [smallint] NOT NULL ,
[broj_kreveta] [smallint] NOT NULL ,
[terasa] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[klima] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[tv] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[mini_bar] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[fen] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[frizider] [char] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[hotelid] [smallint] NOT NULL ,
PRIMARY KEY CLUSTERED
(
[apartmanid]
) ON [PRIMARY]
) ON [PRIMARY]
GO
---------------------------------------------------------------------
Primer (Podaci za dva hotela '123' i '122'):
Query: SELECT * FROM apartman

Rezultat:

apartmanid broj_sobe broj_kreveta terasa klima tv mini_bar fen frizider hotelid
1 2 2 1 1 1 0 0 1 123
2 3 4 2 1 1 1 1 2 123
12 4 4 2 1 2 1 1 2 122
33 1 2 1 1 1 1 1 1 122
35 2 3 2 1 2 1 1 2 122

----------------------------------------------------------------------------
Query - (agregacije):

SELECT HotelID,
Koliko_apartmana = count( ApartmanID ),
Koloko_terasa = count( terasa ),
Koliko_televizora = count( tv ),
Koliko_mini_barova = count( mini_bar )
FROM apartman
WHERE hotelid='122'
GROUP BY HotelID
HAVING count(ApartmanID) > 0

Rezultat gornjeg upita:

HotelID Koliko_apartmana Koloko_terasa Koliko_televizora Koliko_mini_barova
122 3 3 3 3
-----------------------------------------------------------------------

Pozdrav,
Milovan











[ jablan @ 25.08.2005. 14:38 ] @
Milovane, pripazi na rečnik.

Nisam ni rekao da NULL ima veze sa agregacijom. NULL ima veze sa brojanjem. To jest, apsolutno nije bitno šta imaš u polju "terasa" sve dok je polje NOT NULL: uvek ćeš dobijati isti rezultat za COUNT(terasa) - isti kao da si uradio COUNT(*). Probaj na svom primeru ako želiš. Agregacija ti je OK.

P.S. (nisam mogao da izdržim) Ti bi, osim što spavaš sa knjigom, trebalo ponekad i da je otvoriš.

[Ovu poruku je menjao jablan dana 25.08.2005. u 15:40 GMT+1]
[ Milovan_B @ 25.08.2005. 14:50 ] @
Izvini za recnik, preterao sam malo ali vise u sali :) nego ozbiljno.
Upit gore nema smisla, ali sa smislom bi izgledao ovako:

SELECT HotelID,
Koloko_terasa = sum( convert(int,terasa) ),
Koliko_televizora = sum( convert(int,tv) ),
Koliko_mini_barova = sum( convert(int,mini_bar) )
FROM apartman
WHERE hotelid='122'
GROUP BY HotelID
HAVING count(ApartmanID) > 0

Rezultat:


HotelID Koloko_terasa Koliko_televizora Koliko_mini_barova
122 5 5 3

(1 row(s) affected)

Pozdrav,
Milovan

[ jablan @ 25.08.2005. 14:54 ] @
Tako već može, s tim što ti je agregacija nepotrebna, s obzirom da izvlačiš podatke samo za jedan hotel.