[ bigtime @ 17.06.2007. 08:02 ] @
Pozdrav,
Imam proceduru u Northwind bazi koju pozivam iz aplikacije i imam jednu promenljivu. Ako u aplikaciji odaberem vise od jednog OrderID broja iz [Order Details] tabele, nece mi grupisati podatke, nego ce dva puta ispisati isti ProductID. Evo koda:


Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID = '10249'
GROUP BY ProductID



Ukoliko stavim i OrderID = '10250' onda ce se procedura dva puta izvrsiti i dobicu dva ProductID sa istim brojem, a zeleo bih da u listi svih ProductID pise samo jedan. Evo i rezultata:
14
51
41
51
65


Pokusao sam sa DISTINCT, GROUP BY, ali ne prolazi...
Da li neko ima mozda pametnu ideju kako bih ovaj problem mogao da resim?
Hvala puno.

Pozdrav,
Vlada
[ majstor_01 @ 18.06.2007. 00:31 ] @
Daj dizajn tabele orders...
[ mmix @ 18.06.2007. 15:25 ] @
Ne mozes ovako. Jedina SQL komanda koja tebi moze da odradi ovaj posao je:

Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID IN ('10249', 'itd', 'itd', 'koliko', 'hoces', 'elemenata')
GROUP BY ProductID


Problem je sto je ova struktura nekompatibilna sa parametrima stored procedure (gornja lista se ne moze proslediti kao parametar). Imas tri alternative:

1. Da ne koristis stored proceduru nego da dinamicki odredis gornji SQL i izvrisis kroz adapter/command, kako vec hoces

2. Da sacekas Orca-u i da iskoristis DLINQ for DataSet da odradis svoju naknadnu agregaciju nakon x poziva stored procedure za svaki red posebno.

3. Da radis softverski agregaciju nad tvojim datasetom (vidi pseudokod), nakon x poziva stored procedure za svaki red posebno:

Code:

foreach (red1 in tabela1.Rows)
{
   if tabela2.sadrziKljuc(red1.productid) 
       tabela2.Red(red1.productid).Quantity += red1.Quantity
   else
      tabela2.DodajRed(red1.productid, red1.Quantity)
}


Prava c# sintaksa je drugacija, ne znam napamet i nemam VS sad, trebalo bi da se lako snadjes sa ovim psudo kodom.
[ bigtime @ 23.06.2007. 23:13 ] @
Citat:
mmix: Ne mozes ovako. Jedina SQL komanda koja tebi moze da odradi ovaj posao je:

Code:

SELECT ProductID, SUM (Quantity)
FROM [Order Details]
WHERE OrderID IN ('10249', 'itd', 'itd', 'koliko', 'hoces', 'elemenata')
GROUP BY ProductID



Hvala puno, to je ta komanda, to mi je trebalo, ali gresim u kodu u aplikaciji. Ako zelim da iz neke kontrole odaberem ProductID za koje zelim da vrsim pretragu, izvrsavam proceduru za toliko puta koliko postoji ProductID. Probao sam da napunim listBox kontrolu sa zeljenim ProductIDp-ijevima i da za svaki ProductID pozivam proceduru, ali tako ne valja. Ako stavim checkBox u dataGrid, onda opet imam foreach petlju za citanje selektovanih ProductID-ijeva i opet pozivam proceduru vise puta.
Na koji nacin se resava ovakav problem?

Pozdrav,
Vlada
[ jablan @ 23.06.2007. 23:37 ] @
Mi smo sasvim lepo rešavali prosleđivanje skupa vrednosti stored proceduri kroz prosleđivanje xml-a sa serijalizovanim vrednostima i korišćenje sp_xml_preparedocument u proceduri.

Ovde imaš kompletan primer.
[ mmix @ 25.06.2007. 12:36 ] @
Totalno cool resenje. Na pamet mi nije palo...
[ zelbi @ 29.06.2007. 21:54 ] @
pozdrav,

ja koristim dva nacina :

1. u proceduru dodam parametar varchar(max) i upotrebljavam funkciju Split (moze se lako naci na internetu) :

Code:

CREATE PROCEDURE dbo.Test
     @ID_Products varchar(max)
AS

select *
from   dbo.Products
where ID_Product in (select convert(int, value) from dbo.Split(@ID_Products, ','))



ID u parametru @ID_Products imaju zarez kao razmak : 1, 2, 3
u SQL 2000, bio sam ogranicen na varchar(8000) u SQL 2005 nema vise toga ogranicenja


2. Drugi trik je dodati kolonu tabeli ID, naprimjer ID_Product2 i ispuniti je na iduci nacin :

Code:

ID_PRODUCT    ID_PRODUCT2
========== ===========
1                         1
2                         2 
3                         4
4                         8 

CREATE PROCEDURE dbo.Test
       @ID_Product2 int
AS

select  *
from    dbo.Products
where  @ID_Product2 & ID_Product2 = ID_Product2



U ovom slucaju parametar @ID_Product2 ti je suma svih ID-a. Ako je izabrat ID_Product 1 i 3, to ti je 1 + 4 = 5 znaci @ID_Product2 = 5
Da ovaj trik radi kako treba nesmijes preci 64 ID_Product-a.

Sto se tice brzine, druga solucija je brza ali ogranicena na 64 proizvoda, dok prva nema ogranicenja.
[ dusans @ 29.06.2007. 23:23 ] @
Ako koristis SP i ne gradis upit dinamicki vec prenosis ID-jeve preko jednog parametra pored navedenih moze i ovakvo resenje naprimer:

Code:

SELECT * FROM Products
WHERE CHARINDEX('|' + CAST(ProductID AS varchar(20)) + '|', @ProductIDs, 1) > 0


Gde je @ProductIDs string parametar sa vrednoscu naprimer '|1|2|3|10|'

Jednostavno je i radi brzo za mali broj rekorda, medjutim ako imas puno rekorda
koristi neko drugo resnje koje nece za svaki rekord pozivati CHARINDEX, tj. vec navedeni
primer sa split funkcijom odnosno xml-om

Pozdrav!