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

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