TSQL - 根据字段值和重复行创建列

时间:2014-02-13 11:10:28

标签: sql sql-server tsql sql-server-2012

在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条款,但我认为这不会起作用。

希望你能告诉我如何解决这个问题。

谢谢。

2 个答案:

答案 0 :(得分: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"?

答案 1 :(得分: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;