|
| 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
| |
|
|