2014-02-13 45 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;