将列连接到行

时间:2016-03-19 17:00:48

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

假设您有一个表 Table1 ,其中包含

  

UserId,Item1,Item2,Item3,Item4,Item5,Item6,Item7,Item8,Item9,Item10

你有另一张表 Table2

  

UserId,ItemId,Name

Table1 中的值是 Table2 中的ItemId。我需要显示

  

UserId,ItemId,Name

其中Item1为1st,Item10为last,您有10行。换句话说,Item1是第1行,I​​tem10是最后一行。如果有任何方法可以避免CASE WHEN那将是伟大的。我将来可能会有更多列,并且不愿意对10列进行硬编码。

4 个答案:

答案 0 :(得分:1)

在这种情况下,我认为您需要反转轴。你没有像普通支点那样使用CASE,而是使用UNION ALL,就像这样:

select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item1 = Table2.ItemId
UNION ALL
select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item2 = Table2.ItemId
UNION ALL
...
select Table1.UserId, Table2.ItemId, Table2.Name
from Table1 inner join Table2 on Table1.Item10 = Table2.ItemId

如果您有更多项目,您还应该能够编写一个生成重复UNION ALL语法的代码段,这样您就不必手动输入所有内容。

答案 1 :(得分:1)

鉴于你可以完全绕过SQL,我强烈推荐使用例如R或Python以ML可用方式处理事务。带有聚集功能的tidyr包正是你想要做的。

另一种方法是交叉试验。使用SQL标准获得解决方案绝对没问题,但是在R或Python中可以更容易地完成许多问题。

答案 2 :(得分:0)

只有3列的table1

userid, itemid, sequence

会更有利于您的目的。您将需要从单行转换AzureML输出

Uid1, itm1,itm2,itm3,...,itm10

分为10行,如

Uid1, itm1, 1
Uid1, itm2, 2
Uid1, itm3, 3
...
Uid1, itm10,10

假设您将上述输出行作为AzureML的(临时)表输出,名称为tbla,您可以使用以下UNION ALL构造(如Spencer Simpson所建议):

INSERT INTO table1 (userid, itemid, sequence)
SELECT uid, itm1, 1 FROM tbla UNION ALL
SELECT uid, itm2, 2 FROM tbla UNION ALL
SELECT uid, itm3, 3 FROM tbla UNION ALL
SELECT uid, itm4, 4 FROM tbla UNION ALL
...
SELECT uid, itm10, 10 FROM tbla

将信息存储到table1中,这将是您必须处理的唯一表格。不再需要JOIN

注意:我不太确定您的专栏name与哪些相关。它是项目的名称还是用户的名称?

在这两种情况下都应该有第二个表table2来处理nameuserid / itemid之间的对应关系

itm/usr   name

此表格将join加入任何需要显示name列的查询中。

答案 3 :(得分:0)

我解决这个问题的方法是使用Python(或R)并使用melt函数。 数据框中还有一个pivot_table函数。

因此,您可以将列转换为行。然后在另一个表上加入这些行。

Reshaping and Pivot Tables