/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Sortering efter sammensat streng
Fra : Leif Neland


Dato : 02-02-07 08:29

mssql

Jeg skal have sorteret nogle hyldenumre, men de er i et besværligt format.

{Sektionsbogstav}{reolnr}"-"{hylde}

c1-3
c2-4
c11-2

En alfabetisk sortering laver rækkefølgen c1 c11 c2 men det burde være c1 c2
c11

Jeg vil nødig til at omformattere feltet; kan man lave en funktion i sql, så
man kan sortere i sql?

Eller bør jeg lave en tabel, der afspejler den fysiske rækkefølge af
reolerne?
Så kan jeg selvfølgelig også få placeret reol c-v mellem c4 og c5

Leif





 
 
Kristian Damm Jensen (02-02-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 02-02-07 10:13

Leif Neland wrote:
> mssql
>
> Jeg skal have sorteret nogle hyldenumre, men de er i et besværligt
> format.
>
> {Sektionsbogstav}{reolnr}"-"{hylde}
>
> c1-3
> c2-4
> c11-2
>
> En alfabetisk sortering laver rækkefølgen c1 c11 c2 men det burde
> være c1 c2 c11
>
> Jeg vil nødig til at omformattere feltet; kan man lave en funktion i
> sql, så man kan sortere i sql?
>
> Eller bør jeg lave en tabel, der afspejler den fysiske rækkefølge af
> reolerne?
> Så kan jeg selvfølgelig også få placeret reol c-v mellem c4 og c5

Nu skriver du ikke, hvilket DBMS du bruger. Nedenstående vil virke på Sybase
og formodentlig og MS SQLServer. Andre systemer har andre måder at
implementere substring, men ideen skulle være klar nok.

select substring(hylde, 1, 1) as sektionsbogstav
, convert(substring(hylde, 2, 24), int) as reolnr
from hylder
order by sektionsbogstav, reolnr

>
> Leif

--
--
Venlig hilsen /Best regards
Kristian Damm Jensen



Leif Neland (04-02-2007)
Kommentar
Fra : Leif Neland


Dato : 04-02-07 22:48

Kristian Damm Jensen wrote:
> Leif Neland wrote:
>> mssql
>>
> Nu skriver du ikke, hvilket DBMS du bruger. Nedenstående vil virke på
> Sybase og formodentlig og MS SQLServer. Andre systemer har andre
> måder at implementere substring, men ideen skulle være klar nok.

Jeg skrev mssql...
> select substring(hylde, 1, 1) as sektionsbogstav
> , convert(substring(hylde, 2, 24), int) as reolnr
> from hylder
> order by sektionsbogstav, reolnr

den vil have "convert(int,substring(hylde,2,24))" men den kan ikke
konvertere "A52-3" ("52-3") til 52
Error converting the varchar '52-3' to int.

Så jeg må nok splitte det efter "-".

Bare man blot kunne konvertere indtil det første non-numeriske tegn.

Leif


>
>>
>> Leif
>
> --



Leif Neland (07-02-2007)
Kommentar
Fra : Leif Neland


Dato : 07-02-07 10:15


"Leif Neland" <leif@neland.dk> skrev i en meddelelse
news:45c2e82a$0$1418$edfadb0f@dread14.news.tele.dk...
> mssql
>
> Jeg skal have sorteret nogle hyldenumre, men de er i et besværligt format.
>
> {Sektionsbogstav}{reolnr}"-"{hylde}
>
> c1-3
> c2-4
> c11-2
>
> En alfabetisk sortering laver rækkefølgen c1 c11 c2 men det burde være c1
c2
> c11

Løsningen blev dette:

order by substring(lagerkode,1,1),case
charindex('-',isnull(t_produkter.lagerkode,'?')) when 0 then 0 else
substring(lagerkode,2,charindex('-',isnull(t_produkter.lagerkode,'?'))-2)
end, lagerkode "

Jeg blev nødt til at lave case-sætningen, fordi mssql dør på negativ
3.parameter (længde), hvis der ikke er et "-" i strengen:
substring(lagerkode,2,-2)
Den burde bare give den tomme streng.
Og det ville så sikkert give en fejl, ved forsøg på at konvertere den til et
tal...

Leif



plykkegaard@gmail.co~ (07-02-2007)
Kommentar
Fra : plykkegaard@gmail.co~


Dato : 07-02-07 13:16

Leif Neland wrote:

> Løsningen blev dette:
> order by substring(lagerkode,1,1), case charindex ...

Vil man ikke opnå et bedre resultat ved at selecte til et view og
derefter lave en sortering på de "virtuelle" felter?

select vp.* from (
select
substring(tp.lagerkode,1,1) As LK1,
case charindex('-',isnull(tp.lagerkode,'?'))
when 0 then 0
else
substring(lagerkode,
2,charindex('-',isnull(tp.lagerkode,'?'))-2)
end As LK2, tp.lagerkode from t_produkter tp)
as vp
order by vp.LK1, vp.LK2, vp.lagerkode

En helt anden diskussion er om man vil gemme lagerkode i en produkt
tabel?
Lagerkode er det placering på lager, eller?

- Peter


Leif Neland (08-02-2007)
Kommentar
Fra : Leif Neland


Dato : 08-02-07 01:32

plykkegaard@gmail.com wrote:
> Leif Neland wrote:
>
>> Løsningen blev dette:
>> order by substring(lagerkode,1,1), case charindex ...
>
> Vil man ikke opnå et bedre resultat ved at selecte til et view og
> derefter lave en sortering på de "virtuelle" felter?
>
> select vp.* from (
> select
> substring(tp.lagerkode,1,1) As LK1,
> case charindex('-',isnull(tp.lagerkode,'?'))
> when 0 then 0
> else
> substring(lagerkode,
> 2,charindex('-',isnull(tp.lagerkode,'?'))-2)
> end As LK2, tp.lagerkode from t_produkter tp)
> as vp
> order by vp.LK1, vp.LK2, vp.lagerkode

Det er muligt, men det skal kun køres et par gange om dagen, med ca 50
records i gennemsnit, så det er ikke værd at optimere.

>
> En helt anden diskussion er om man vil gemme lagerkode i en produkt
> tabel?
> Lagerkode er det placering på lager, eller?

Det er det.
Det kan godt være det skal løftes ud, hvis man har flere lagre, men p.t. er
det en mange til een relation (?) Hver vare kan kun være på een hylde, men
der kan godt være flere varer på samme hylde.

Leif

>
> - Peter



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste