我有一个Sybase表(我无法改变),我试图进入特定的表格式。该表包含三列,所有列都是字符串值,具有id(不唯一),“position”是表示字段名称的数字,以及作为值的字段列。该表看起来像:
id position field
100 0 John
100 1 Jane
100 2 25
100 3 50
101 0 Dave
101 3 30
位置0表示“SalesRep1”,位置1表示“SR1Commission”,位置2表示“SalesRep2”,位置3表示“SR2Commission”。 我试图得到一个看起来像下面的表,委员会的列是小数而不是字符串:
id SalesRep1 SR1Commission SalesRep2 SR2Commisson
100 John 25 Jane 50
101 Dave 30 NULL NULL
我已经接近使用CASE,但我最终每行只有一个值,并且不确定是否有办法做我想要的。我也有尝试包含CAST以将佣金值从字符串更改为小数的问题。这是我到目前为止所做的:
SELECT id
CASE "position" WHEN '0' THEN field END AS SalesRep1,
CASE "position" WHEN '1' THEN field END AS SalesRep2,
CASE "position" WHEN '2' THEN field END AS SR1Commission,
CASE "position" WHEN '3' THEN field END AS SR2Commission
FROM v_custom_field WHERE id = ?
查询id 100时,这会给我以下结果:
id SalesRep1 SR1Commission SalesRep2 SR2Commission
100 John NULL NULL NULL
100 NULL 25 NULL NULL
100 NULL NULL Jane NULL
100 NULL NULL NULL 50
这很接近,但我希望根据id将行“折叠”为一行,并将佣金值转换为数字。我尝试添加一个CAST(字段AS DECIMAL)我不确定这是否是正确的方向,并且正在调查PIVOT,但Sybase似乎不支持它。
答案 0 :(得分:1)
这称为entity-attribute-value table。他们的工作很痛苦,因为他们从关系数据中删除了一步,但对于应用程序中用户定义的字段,它们非常常见。
如果你不能使用PIVOT,你需要做这样的事情:
SELECT DISTINCT s.id,
f0.field AS SalesRep1,
CAST(f1.field AS DECIMAL(20,5)) AS SR1Commission,
f2.field AS SalesRep2,
CAST(f3.field AS DECIMAL(20,5)) AS SR2Commission
FROM UnnamedSalesTable s
LEFT JOIN UnnamedSalesTable f0
ON f0.id = s.id AND f0.position = 0
LEFT JOIN UnnamedSalesTable f1
ON f1.id = s.id AND f1.position = 1
LEFT JOIN UnnamedSalesTable f2
ON f2.id = s.id AND f2.position = 2
LEFT JOIN UnnamedSalesTable f3
ON f3.id = s.id AND f3.position = 3
它不是很快,因为它有大量的自连接,然后是DISTINCT,但确实有效。