Sybase SQL 带 CAST 的案例

Sybase SQL CASE with CAST

我有一个 Sybase table(我无法更改),我正试图将其转换为特定的 table 格式。 table 包含三列,它们都是字符串值,带有一个 id(不是唯一的),一个 "position" 是一个代表字段名称的数字,以及一个作为值的字段列。 table 看起来像:

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"。 我正在尝试获得如下所示的 table,佣金列是小数而不是字符串:

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 'collapse' 将这些行向下合并为一行,并将佣金值转换为数字。我尝试添加 CAST(field AS DECIMAL) 我不确定这是否是正确的方向,并且正在研究 PIVOT,但 Sybase 似乎不支持它。

这被称为 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,但它确实有效。