假设您有一个表 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行,Item10是最后一行。如果有任何方法可以避免CASE WHEN那将是伟大的。我将来可能会有更多列,并且不愿意对10列进行硬编码。
答案 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
来处理name
和userid
/ itemid
之间的对应关系
itm/usr name
此表格将join
加入任何需要显示name
列的查询中。
答案 3 :(得分:0)
我解决这个问题的方法是使用Python(或R)并使用melt
函数。
数据框中还有一个pivot_table
函数。
因此,您可以将列转换为行。然后在另一个表上加入这些行。