2016-07-30 22 views
0

ONテーブルに参加しますすなわちSQL Serverのストアドプロシージャは、私がこのように、車の部品とT1を持ってT1.ID =ミッド(T2.valutation)

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 
01: valutationの各番号は文字列内のその位置に応じて車の一部を指す数字の文字列[0-9]

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

が含まvalutationと呼ばれます

に、私はいくつかのソリューションを試みたが、あなたは、私が実際に行う質問の(間違った)被験者から見ることができるように、この

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

を返すSQL Serverのストアドプロシージャを構築する必要があります

ので、どんな種類の機能が必要なのかは分かりません。 @dfundakoが指摘したように

おかげ

+1

これは非常に貧しいデザインです。あなたは本当にそれを回避するprocを構築するのではなく、それを再考するべきです。 – dfundako

+1

あなたのデータベース設計にはひどい欠陥があります。あなたがこれをしなければならないという事実は、それをあなたに示す非常に明確な兆候であるはずです。 –

答えて

1

それを行う動的SQL。私はこれをチェックすることはできませんが、私はちょうどどうなるSQLサーバーへのアクセスを持っていない:

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) 

(私は「評価」のあなたの明白なスペルミス、すなわちをコピーした、私はそれが「valutation」つづられていますと仮定しましたあなたのテーブルにあります)

+0

は素晴らしいですが、私はあなたがエイリアスのための選択を使用することはできませんと思う:-( – Joe

+0

謝罪、私は自分のコードで間違いを犯しました。 –

+0

はい、いくつかマイナーチェンジで動作しています。ありがとうございました。 – Joe

0

が、これは非常に貧弱なデザインで、道の下のあなたを悩まする可能性があります。

しかし、ほとんどのプログラミングと同様に、「何でも可能です」。

ここでは、CTEを使用して、必要なものを簡単に確認できます。

これは動的なバージョンではありません。つまり、ルックアップテーブルからラベルをハードコードしています。あなたはここからそれを取ることができます。

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

あなたが望む適切な関係構造を、あなたはそれを変更することができれば、より多くの次のようなものです:

あなたが使用することができ

Proper Structure

+0

はい、これはおそらく問題に近づく最悪の方法だと知っていますが、それはdbのコアテーブルではないためです.T1が静的ではないため、処理がはるかに簡単でした。私はその理由で文字列を使用しましたが、多分すべてを別の方法で再構築すればよいでしょう。 – Joe