带有CAST的Sybase SQL CASE

时间:2015-06-22 17:18:29

标签: sql casting pivot case sybase

我有一个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似乎不支持它。

1 个答案:

答案 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,但确实有效。