2014-02-13 50 views
2

在TSQL我怎麼可以把這個示例表:TSQL - 創建基於字段值列和複製行

ID FIELDNO ROWNO VALUE 
ABC 2  1  Cat1Val1 
ABC 2  2  Cat1Val2 
ABC 2  3  Cat1Val3 
ABC 3  1  Cat2Val1 
ABC 3  2  Cat2Val2 
ABC 5  1  Cat3Val1 

到將創建一個基於fieldno三列的表格,複製行,以便它列出了哪個fieldno具有最高rowNo的所有可能的變體?

所以fieldno 2將成爲CAT1,3 - > CAT2和5 - > CAT3

預期結果:

ID CAT1  CAT2  CAT3 
    ABC Cat1Val1 Cat2Val1 Cat3Val1 
    ABC Cat1Val1 Cat2Val2 Cat3Val1 
    ABC Cat1Val2 Cat2Val1 Cat3Val1 
    ABC Cat1Val2 Cat2Val2 Cat3Val1 
    ABC Cat1Val3 Cat2Val1 Cat3Val1 
    ABC Cat1Val3 Cat2Val2 Cat3Val1 

然後我可以以此爲基礎的加盟與其他表。

這裏是一個fiddle與更多的數據。

我試圖創建一些CASE WHEN子句,但我認爲這是行不通的。

希望你能告訴我如何解決這個問題。

謝謝。

+1

你能解釋一下爲什麼你需要在這個格式的數據?看起來非常不尋常的是,你將首先用這種方式去規範化,然後加入到其他表中。 –

回答

1

這似乎有點非正統的,但這應該爲你做,如果我理解正確的問題:

SELECT d1.id, d1.value Cat1, d2.value Cat2, d3.value Cat3 
FROM Docs d1 
    INNER JOIN Docs d2 ON d2.id = d1.id AND d2.rowNo = d1.rowNo AND d2.fieldNo = 3 
    INNER JOIN Docs d3 ON d3.id = d2.id AND d3.rowNo = d1.rowNo AND d3.fieldNo = 5 
     AND d1.fieldNo = 2 

當然,該解決方案預計值將存在每一列。

修訂的答案...

如果第三個加入,只有第三個加入(Docs.fieldNo = 5)是可選的,你可以做這樣的事情:

SELECT 
    d2.id, 
    d2.value Cat1, 
    d3.value Cat2, 
    d5.value Cat3 
FROM 
    (SELECT 2 fieldNo2, 3 fieldNo3, 5 fieldNo5) f 
    INNER JOIN Docs d2 ON d2.fieldNo = f.fieldNo2 
    INNER JOIN Docs d3 ON d3.fieldNo = f.fieldNo3 and d3.rowNo = d2.rowNo and d3.id = d2.id 
    LEFT JOIN Docs d5 ON d5.fieldNo = f.fieldNo5 and d5.rowNo = d2.rowNo and d5.id = d2.id 

我已經修改了休息的查詢,所以希望它做的更清楚一點。

這裏是連接,你可能會發現有用的一些答案:What is the difference between "INNER JOIN" and "OUTER JOIN"?

+0

我承認這很奇怪,但基表具有這種通用內置,我可能必須至少使用cat1和cat2作爲不同表上的ID。 這還不夠。輸出中沒有XYZ。 看到這個[fiddle](http://sqlfiddle.com/#!6/8e6af/10) –

+0

@TonyClifton我剛剛意識到我有一個拼寫錯誤在一個連接。一旦我有了一點時間,我會再看看你的其他要求。由於「INNER JOIN」,這個解決方案沒有爲XYZ返回任何東西。 – Manny

+0

@TonyClifton如果2不存在,是否可以有3的值。同樣,如果3和2不存在,是否可以有5的值? – Manny

0

我在訪問數據庫中試過這個: 用值替換myvalue(值是訪問中的保留字) 我調用了表測試,因此將其替換爲您的表名。

SELECT test.id, test.myValue AS cat1, test_1.[myValue] AS cat2, test_2.myValue AS cat3 
FROM test, test AS test_1, test AS test_2 
WHERE (((test.myValue) Like "cat1*") 
AND ((test_1.[myValue]) Like "cat2*") 
AND ((test_2.myValue) Like "cat3*")) 
ORDER BY test.myValue, test_1.[myValue], test_2.myValue;