seahawkMedlem sedan mars 20017 inlägg Jag har ett litet problem med en select-sats. Det finns säkert en enkel lösning, men jag kommer inte på den.
Jag har en order-tabell i en e-handelssajt. Varje rad i tabellen motsvarar en såld artikel och en ordrana hålls ihop av en kolumn som heter order_nr.
Det jag skulle kunna göra är att:
select distinct(order_nr) from order_tbl
men då får jag såklart bara ut order_nr-kolumnen. Jag vill såklart ha resten också. Blandar jag in ASP i det hela blir det lätt, men jag vill undvika det.
Just nu ser SQL-satsen ut så här:
select distinct(order_nr),* from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString;
där @strSearchType är ett kolumnnamn och @strSearchString överraskande nog är en söksträng. =)
Är det någon som har en lösning?
LarsGMedlem sedan dec. 200012 464 inlägg Välkommen till Webforum
Distinct appliceras alltid på alla uttryck i select-listan.
Hur hade du tänkt att resultatet skulle se ut? Resultatet av en select blir alltid en tabell där alla poster har lika många kolumner.
Om du bara vill skriva ut varje unikt ordernr en gång så får du sköta det i klienten och i så fall behöver du en
order by ordernr
------------------
essentitia preter non sans multiplicandum
seahawkMedlem sedan mars 20017 inlägg Det finns i min ordertabell flera grupper, poster med samma order_nr. Det är alltså inte möjligt att bara selecta den första posten i dessa grupper?
OrderID | OrderNr | KundId |
1 1 12
2 1 12
3 1 12
4 2 18
5 2 18
6 3 10
Det jag vill ha ut ur den är:
OrderID | OrderNr | KundId |
1 1 12
4 2 18
6 3 10
Jag sitter i ASP och det är ju lätt att fixa där, men jag vill helst göra så mycket som möjligt av jobbet direkt i SQL =)
seahawkMedlem sedan mars 20017 inlägg ok, den ströp min <space> men jag tror du fattar mina tabeller ändå =)
LarsGMedlem sedan dec. 200012 464 inlägg Varför behöver du ha med orderid?
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString
group by ordernr,kundid
Nu får du lägsta orderid inom varje unik grupp av ordernr och kundid
------------------
essentitia preter non sans multiplicandum
seahawkMedlem sedan mars 20017 inlägg Det funkar, fast mina tabeller är aningen större än så. Inte heller innehållet i mina joins kommer med om man gör så. Jag är så långt under ytan på denna att jag knappt vet vad jag ska fråga. ;)
Resultatet ska bli som det jag fick innan, fast med alla kolumner i databasen, det handlar om korg_datum,artikel_pris,artikel_wap_pris osv.
LarsGMedlem sedan dec. 200012 464 inlägg Då får du lägga till dessa kolumner i group by utttrycket också.
Om du använder group by så måste alla kolumner i select-listan, som inte används i någon aggregatfunktion (min,max etc) vara med i group by
Vad menar du med detta?
where @strSearchType like @strSearchString
skriver du så direkt i din sqlsats? (Jag trodde att du menade det hela mer bildligt.)
Om du har ett kolumnnamn i en variabel som du vill få in i ett select-uttryck så måste du bygga ihop det till en sträng och använda kommandot exec
------------------
essentitia preter non sans multiplicandum
seahawkMedlem sedan mars 20017 inlägg Det är en stored procedure i MS SQL 7. Den börjar med:
CREATE PROCEDURE [_sp_order_list_wildcard]
@strSearchString varchar(40),
@strSearchType varchar(20)
AS
select......
Jag plockar alltså in @-värdena när jag anropar proceduren. Det verkar funka bra.
@strSearchString har värdet av '%formularvarde%'
@strSearchType kan ha värdet kund_enamn, kund_fnamn osv beroende på ett val i en selectlista. Inga fnuttar kring värdet alltså. Det verkar funka bra. =)
Men jag tror jag har fått till det nu.
select min(order_id) as order_id,order_nr,kund_fnamn,kund_enamn,kund_postort osv osv
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where @strSearchType like @strSearchString
group by kund_postort,kund_enamn,kund_fnamn,order_nr
LarsGMedlem sedan dec. 200012 464 inlägg where @strSearchType like @strSearchString
blir ju en jämförelse mellan de värden som finns i variablerna och den går nog bra om ditt formulärsvärde är tomt, då det blir analogt med
where 'kund_enamn' like '%%'
så det borde inte fungera om man anger något sökvärde
------------------
essentitia preter non sans multiplicandum
seahawkMedlem sedan mars 20017 inlägg Du är inte dum du, det blir som du säger. Det funkade med de enstaka bokstäverna k,u,n,d,_,e,n,a,m,n. samt tomt fält. =) Hade hoppats att kunna mata in tabellnamnet så, men det gick alltså inte.
Det får jag fixa på något annat sätt.
Angående den andra satsen. Den ballar ur när jag lägger till korg_datum i select och group by, då plötsligt dyker vissa tre ordernummer upp två ggr. =)
Svårt för dig att kolla upp utan databasen kanske, men har du någon idé?
LarsGMedlem sedan dec. 200012 464 inlägg För att lösa problemet med sökningen kan du antingen göra så här
if @strSearchType = 'kund_enamn'
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where kund_enamn like @strSearchString
group by ordernr,kundid
if @strSearchType = 'kund_fnamn'
select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where kund_fnamn like @strSearchString
group by ordernr,kundid
osv, den blir lite tråkig om man har många kolumner.
Annars kan man göra så här
CREATE PROCEDURE [_sp_order_list_wildcard]
@strSearchString varchar(40),
@strSearchType varchar(20)
AS
declare @sqlstr varchar(400)
select @sqlstr = 'select min(orderid),ordernr,kundid
from order_tbl o
inner join kund_tbl k
on o.kund_id=k.kund_id
inner join artikel_tbl a
on o.artikel_id=a.artikel_id
where ' + @strSearchType + ' like ' +
'''' + @strSearchString + '''' +
' group by ordernr,kundid'
exec (@sqlstr)
å andra sidan så blir det sämre prestanda då det måste kompileras varje gång.
Angående den andra satsen. Den ballar ur när jag lägger till korg_datum i select och group by, då plötsligt dyker vissa tre ordernummer upp två ggr. =)
Svårt för dig att kolla upp utan databasen kanske, men har du någon idé?
Nej, jag har ingen direkt ide.
Hur ser frågan ut nu?
red: Glömde tag
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 27 aug 2001]
seahawkMedlem sedan mars 20017 inlägg det var när jag la in "korg_datum" i frågan som det hände.
select min(order_id) as order_id,order_nr,korg_datum
from order_tbl o ....
Men jag kan klara mig utan det datumet. Jag tog din sql-procedur rakt av och den funkade perfekt. Hittade ingen (C) på den så jag använder den med lite modifikationer.
Tack för hjälpen! =)