Avatar billede kavlar Novice
18. november 2015 - 18:40 Der er 8 kommentarer

SELECT statement, hvor kolonner vælges på baggrund af select fra et andet Select statement

Jeg har en tabel, der fortæller hvilke kolonner i en anden tabel, jeg skal arbejde med.

eks
Tabel 1
Kundenummer  |  COL1          |  COL2
1234        |  KUNDEGRUPPE  |  KUNDETYPE
2345        |  KUNDETYPE    |  PRISLISTE

Tabel 2

KUNDENUMMER | KUNDENAVN | KUNDETYPE | KUNDEGRUPPE | PRISLISTE
1234        | ABC      | A        | 12          | 17
2345        | QWE      | A        | 14          | 99

Det jeg godt kunne tænke mig, er en Select statement, der henter følgende:

Kundenummer  | VAL_COL1  |  VAL_COL2
1234        | 12        |  A
2345        | A        |  99

Nogen ideer?
Avatar billede arne_v Ekspert
18. november 2015 - 18:46 #1
Under forudsaetning af at det er noget som du tilgaard fra et program saa synes det mest logisk at foerst lave en query paa tabel 1 og saa konstruere query paa tabel 2 udfra denne.
Avatar billede kavlar Novice
18. november 2015 - 19:23 #2
Hej Arne,

Tak for dit svar. Jeg arbejder desværre ikke i et program, men forsøger at lave et enkelt select statement, der henter dataene.

Umiddelbart ville jeg tro, at det kunne være noget lignende

SELECT
  Kundenummer,
  (SELECT COL1 FROM TABEL1 b WHERE b.Kundenummer = a.Kundenummer) VAL_COL1,
  (SELECT COL2 FROM TABEL1 b WHERE b.Kundenummer = a.Kundenummer) VAL_COL2
FROM TABEL2 a

Men da får jeg blot kolonnenavnet:

Kundenummer  | VAL_COL1  |  VAL_COL2
1234        | KUNDEGRUPPE|  KUNDETYPE
2345        | KUNDTYPE  |  PRISLISTE

og ikke værdierne for de kolonner.

Så en slags...
SELECT
  Kundenummer,
  Værdi for kolonnen med navnet (SELECT COL1 FROM TABEL1 b WHERE b.Kundenummer = a.Kundenummer) VAL_COL1,
  ( Værdi for kolonnen med navnet SELECT COL2 FROM TABEL1 b WHERE b.Kundenummer = a.Kundenummer) VAL_COL2
FROM TABEL2 a

Giver det mere mening?
Avatar billede arne_v Ekspert
18. november 2015 - 19:43 #3
Maaske kan du bruge PIVOT.
Avatar billede Slettet bruger
19. november 2015 - 09:04 #4
with data as (

select kundenummer, col1, col2 from tabel1
)
,
data2 as (
select kundenummer,val_col1,val_col2 from tabel2
)

select a.Kundernummer,a.col1,a.col2,b.val_col1,b.val_col2 from data a
inner join data2 b on a.kundernummer = b.kundenummer


inner join eller left join er op til dig
Avatar billede Slettet bruger
19. november 2015 - 09:10 #5
Læste måske dit spm forkert.

Men med ovenstående kan du joine dine rækker sammen. Ellers skal du lave PIVOT som arne skriver:)

Du opstiller det lidt rodet synes jeg - Hvad er formålet og hvorfor er det så ustruktureret dine tabeller?
Avatar billede Slettet bruger
19. november 2015 - 15:02 #6
Et select som dette vil finde de rigtige data - men man kan ikke blande datatype i samme kolonne, så der skal der bruges CAST eller CONVERT.

select t1.Kundenummer
,case when t1.Col1 = 'KUNDENAVN' then
cast((select max(Kundenavn) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col1 = 'KUNDETYPE' then
cast((select max(Kundetype) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col1 = 'KUNDEGRUPPE' then
cast((select max(Kundegruppe) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col1 = 'PRISLISTE' then
cast((select max(Prisliste) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
end Val_Col1
,case when t1.Col2 = 'KUNDENAVN' then
cast((select max(Kundenavn) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col2 = 'KUNDETYPE' then
cast((select max(Kundetype) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col2 = 'KUNDEGRUPPE' then
cast((select max(Kundegruppe) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
when t1.Col2 = 'PRISLISTE' then
cast((select max(Prisliste) from Tabel2 where Kundenummer = t1.Kundenummer) as varchar)
end Val_Col2
from Tabel1 t1
Avatar billede kavlar Novice
20. november 2015 - 08:24 #7
Hej alle,

Jeg har ikke haft mulighed for at se på jeres besvarelser endnu. Jeg tror rahp måske har en løsning jeg kan bruge.

Jeg beklager strukturen i tabellerne virker rodet. Baggrunden er egentlig OK, men vil nok være lidt kompleks at forklare her. Jeg forsøger i princippet blot at genskabe en logik i en SQL som vores ERP anvender til at finde en pris på en given vare. Og til det har jeg behov for at finde værdien af et vilkårligt felt i kundestamdata, defineret af værdien i et felt i en anden tabel.
Jeg kigger på jeres løsningsforslag og vender tilbage...
Tak for hjælpen
Avatar billede kjulius Novice
01. januar 2016 - 20:43 #8
Mit forslag ville nok være en forsimplet udgave af rahp's query (jeg kan ikke lide de indbyggede subqueries, og kan heller ikke se formålet med dem):

-- Opret tabellerne...
CREATE TABLE #tabel1 (
    KUNDENUMMER INT,
    COL1 VARCHAR(20),
    COL2 VARCHAR(20)
    );
CREATE TABLE #tabel2 (
    KUNDENUMMER INT,
    KUNDENAVN VARCHAR(30),
    KUNDETYPE VARCHAR(10),
    KUNDEGRUPPE VARCHAR(10),
    PRISLISTE VARCHAR(10)
    );
-- Befolk tabellerne med relevante data...
INSERT INTO #tabel1 (KUNDENUMMER, COL1, COL2)
    SELECT 1234, 'KUNDEGRUPPE', 'KUNDETYPE'
    UNION ALL
    SELECT 2345, 'KUNDETYPE', 'PRISLISTE';
INSERT INTO #tabel2 (KUNDENUMMER, KUNDENAVN, KUNDETYPE, KUNDEGRUPPE, PRISLISTE)
    SELECT 1234, 'ABC', 'A', '12', '17'
    UNION ALL
    SELECT 2345, 'QWE', 'A', '14', '99';

-- Udfør forespørgsel...

SELECT    t1.KUNDENUMMER,
        CASE    WHEN t1.COL1 = 'KUNDETYPE' THEN t2.KUNDETYPE
                WHEN t1.COL1 = 'KUNDEGRUPPE' THEN t2.KUNDEGRUPPE
                WHEN t1.COL1 = 'PRISLISTE' THEN t2.PRISLISTE
                ELSE NULL
        END AS COL1_VAL,
        CASE    WHEN t1.COL2 = 'KUNDETYPE' THEN t2.KUNDETYPE
                WHEN t1.COL2 = 'KUNDEGRUPPE' THEN t2.KUNDEGRUPPE
                WHEN t1.COL2 = 'PRISLISTE' THEN t2.PRISLISTE
                ELSE NULL
        END AS COL2_VAL
FROM            #tabel1 AS t1
INNER JOIN        #tabel2 AS t2 ON t1.KUNDENUMMER = t2.KUNDENUMMER;


Resultat:
KUNDENUMMER COL1_VAL  COL2_VAL
----------- ---------- ----------
1234        12        A
2345        A          99

(2 row(s) affected)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester