2016-07-30 2 views
0

Ich habe T1 mit Teilen des Autos, wie folgt aus:SQL Server gespeicherte Prozedur Join-Tabelle ON T1.ID = mid (T2.valutation)

ID Name 
------------- 
1 Tyres 
2 Gearbox 
3 Engine 
4 Body 
5 Brakes 
6 .. 

und T2 mit der Liste der Autos mit einer Spalte valutation genannt, die eine Reihe von Zahlen enthalten [0-9]

ID Brand Model Color Year KKm  .... valutation 
--------------------------------------------------------------- 
1 Audi A3  Green 2014 185    86354 

Jede Zahl in valutation an einen Teil des Fahrzeugs bezieht sich gemäß seiner Position in der Kette:

dh
8, since it is in position 1, refers to Tyres 
6, since it is in position 2, refers to GearBox 
... 
4, since it is in position 5, refers to Brakes 

und so weiter

Ich brauche eine SQL Server gespeicherte Prozedur erstellen, die diese Rückkehr

ID Brand Model Color Year KKm  Tyres GearBox Engine Body Brakes 
---------------------------------------------------------------------------------------- 
1 Audi A3  Green 2014 185  8   6  3  5  4 

ich eine Lösung versucht, aber wie man sich von den (falschen) Gegenstand der Frage sehen kann ich eigentlich nicht wirklich wissen, welche Art von Funktion benötigt wird.

Dank

+1

Dies ist ein sehr schlechtes Design. Sie sollten es wirklich überdenken, anstatt einen Proc zu bauen, um es zu umgehen. – dfundako

+1

Ihr Datenbankdesign ist stark fehlerhaft. Die Tatsache, dass Sie dies tun müssen, sollte ein sehr deutlicher Hinweis darauf für Sie sein. –

Antwort

1

Sie verwenden könnten dynamisches SQL, um das zu tun. Ich habe keinen Zugriff auf SQL-Server, damit das nicht überprüfen kann, aber ich würde nur tun:

declare @sql varchar(200) 
declare @i int 

set @sql = 'select *' 
set @i = 1 

While @i <= (select count(*) from T1) 
begin 
    set @sql = @sql + ', substring(valuation,' + cast(@i as varchar(10)) + ',1) as ' + (select name from T1 where id = @i) 
    set @i = @i + 1 
end 

set @sql = @sql + ' from T2' 

exec(@sql) 

(Ich habe Ihre scheinbare falsche Schreibweise von ‚Bewertung‘ kopiert, also habe ich angenommen, es wird geschrieben ‚währungspolitische‘ in Ihrer Tabelle.)

+0

wäre toll, aber ich denke, du kannst keinen Select für den Alias ​​verwenden :-( – Joe

+0

Entschuldigung, ich habe einen Fehler in meinem Code gemacht. Jetzt korrigiert, um die Select-Anweisung außerhalb der Anführungszeichen zu verschieben und auch die @i nach außen zu verschieben Lass es mich wissen, wenn es funktioniert. –

+0

ja, mit ein paar kleinen Änderungen funktioniert es jetzt, vielen Dank – Joe

0

AS @dfundako wies darauf hin, das ist sehr schlechtes Design und wird wahrscheinlich auf der Straße verfolgen.

Wie bei den meisten Programmen ist "alles möglich".

Also hier ist eine schnelle Version von dem, was Sie wollen, mit einem CTE.

Dies ist keine dynamische Version, in dem Sinne, dass ich Ihre Etiketten hart aus der Nachschlagetabelle codiere. Sie können es von hier nehmen:

DECLARE @t TABLE(id int, Valuation VARCHAR(50)) 

INSERT INTO @t 
    SELECT ID, Valuation FROM T2 
;WITH cte AS 
    (SELECT id, Valuation, SUBSTRING(Valuation, 1, 1) AS position_char, 1 AS ind FROM @t 
    UNION ALL 
    SELECT id, Valuation, SUBSTRING(Valuation, ind + 1, 1) AS position_char, ind + 1 FROM cte WHERE LEN(Valuation) > ind 
    ) 

SELECT T2.Model, T2.Brand, T2.Color, T2.valuation, 
    p.[1] AS 'Tyres', [2] AS 'Gearbox', [3] AS 'Engine', [4] AS 'Body', [5] AS 'Brakes' 
FROM cte 
PIVOT (MAX(position_char) 
    FOR ind IN([1],[2],[3],[4],[5])) p 
INNER JOIN T1 
    ON p.id = T1.ID 
INNER JOIN T2 
    ON T1.ID = T2.ID 

Output

Die richtige relationale Struktur, die Sie wollen, wenn Sie es ändern können, ist mehr wie folgt aus:

Proper Structure

+0

Ja, ich weiß, das ist der wahrscheinlich schlechteste Weg, um das Problem anzugehen, aber da es absolut nicht die Kerntabelle der Datenbank ist, war dies viel einfacher zu handhaben, weil T1 nicht statisch ist: jetzt hat es 12 Datensätze, könnte aber steigen zu mehr als 40. Ich habe die Saite aus diesem Grund benutzt, aber vielleicht ist es besser, wenn ich alles anders aufbaut. – Joe

Verwandte Themen