webForumDet fria alternativet

Högsta värdet från flera kolumner

Databaser & SQL

8 svar · 311 visningar · startad av The_Hulk

Medlem sedan juni 20031 837 inlägg
Frågan#1

Kan man på något enkelt sätt hämta ut det högsta värdet av ett antal kolumner.

ID | A | B | C
--------------
1  | 1 | 2 | 3 
2  | 4 | 6 | 5
3  | 7 | 2 | 4
4  | 5 | 6 | 2

SELECT ID, ???(A, B, C) AS Highest FROM tblABC
vill få ut

ID | Highest
------------
1  | 3
2  | 6
3  | 7
4  | 6
Medlem sedan juni 200032 967 inlägg
#2

Ja, det går, men datamodellen är felaktig.
Normalt sett svarar jag "gör om, gör rätt", men nu nöjer jag mig med att tipsa om sökfunktionen, då dylik fråga tidigare besvarats (av LarsG om jag inte missminner mig.)

mvh

Medlem sedan juni 20031 837 inlägg
#3

Det är inte MAX() jag vill använda utan få reda på det högsta värdet av ett antal kolumner på EN rad.

Har försökt söka men hittade inte någon som frågat efter samma sak.

Medlem sedan juni 200032 967 inlägg
#4

Jag förstod vad du var ute efter.

Vad är det för information som är så olika så datat skall lagras i olika kolumner, men så lika att de olika kolumnerna kan jämföras med varandra?

Låter som ett designfel. Annars får du nog laborera med UNION. LarsG har besvarat en närbesläktad fråga här.

mvh

Medlem sedan juni 200032 967 inlägg
#5

... eller:

select id, case when a > b and a > c then a else 
when b > a and b > c then b else 
when c > a and c > b then c end end end ...

kul... :)

Medlem sedan juni 20031 837 inlägg
#6

Gjorde bara ett litet exempel för att det skulle gå snabbare.
egentligen är det samma fält fast har joinat in samma tabell flera gånger. Tabellen som blev joinad har ett fält som heter modified och jag ville veta när det senat var ändrat.
Har en huvudtabell A samt några extra tabeller B, C, D som innehåller data som inte finns med till alla post i tabell A och som kommer att variera väldigt mycket.

Tabell B:
ID | A_ID | EXT_KEY | EXT_VALUE | MODIFIED
---------------------------------------------

select A.*, B_1.EXT_VALUE, B_2.EXT_VALUE, C_1.EXT_VALUE, D_1.EXT_VALUE, ???(A.MODIFIED, B_1.MODIFIED, B_2.MODIFIED, C_1.MODIFIED, D_1.MODIFIED)
FROM A
join B as B_1 on B_1.A_ID=A.ID and B_1.EXT_KEY='...'
join B as B_2 on B_2.A_ID=A.ID and B_2.EXT_KEY='...'
join B as C_1 on C_1.A_ID=A.ID and D_1.EXT_KEY='...'
join B as D_1 on D_1.A_ID=A.ID and C_1.EXT_KEY='...'

Designen av databasen är inget jag kan påverkar, tillhör ett stor system som inte vi har utvecklat men så ville ett annat företag få ut data och då skulle vi skapa en vy där de lätt kund läsa det.

Medlem sedan juni 20031 837 inlägg
#7

@nders skrev:

... eller:

select id, case when a > b and a > c then a else 
when b > a and b > c then b else 
when c > a and c > b then c end end end ...

kul... :)

Var rädd att det var något sådant man var tvungen att göra. Blir nog inte så bra då det är runt 15 000 rader i den slutliga vyn och det är runt 15 tabeller som har kolumnen modified :(

men tack iaf för hjälpen.

Medlem sedan juni 200032 967 inlägg
#8

Du får nog prova någon sorts case-historia då (som mitt inlägg ovan), om den dbms du använder stödjer "case", annars finns något motsvarande.

Det blir kladdigt... :)

mvh

Medlem sedan juni 20031 837 inlägg
#9

det är Microsoft SQL Server, vet inte exakt vilken version men tror det är den näst senaste.

Fick tips om att använda stored procedure eller function.
Får se om någon av dem kan lösa mitt problem på ett smidigt sätt.
Jag borde kunna göra en function som tar emot alla mina MODIFIED och returnerar den senaste. Kan man ta emot ett dynamiskt antal parametrar eller måste man veta exakt hur många det är?

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)