如何在SQL中将单个记录转换为多个记录?

时间:2019-01-30 16:04:28

标签: sql oracle

我们拥有一个Oracle数据库,其中包含数千条从我们这里接受服务的客户的记录。我们提供的服务列表的示例服务表(简体)如下:

Service Table
------------------------------------
| id | service_code | name | price |
------------------------------------
|  1 |     101      |  abc |   20  |
|  2 |     102      |  xyz |   20  |
------------------------------------

上面是数据库中的简化表。在这里,某些服务(每个记录代表一个服务)是个体的,而某些则是两个服务的组(应该总是以集合/组的形式给出)。

问题: 假设ID为2的服务是一组两个服务。我们需要为其打印发票,以分别显示两项服务的输入。我需要一个SELECT查询。

Invoice Example:
    ---------------------------------
    | service_code |  name  | price |
    ---------------------------------
    |     102A     |  xyz_A |   15  |
    |     102B     |  xyz_B |   05  |
    ---------------------------------

我知道使用Oracle案例语句可以更改如下值:

SELECT 
CASE id WHEN 2 THEN '102A'
END AS 'service_code'
CASE id WHEN 2 THEN 'xyz_A'
END AS 'name'
CASE id WHEN 2 THEN 15
END AS 'price'
FROM customers;

(我知道每个服务代码的case语句将有多个when

希望您理解我的问题。 现在问题出在第二子服务上呢?如何获得?有什么办法吗?

second sub service => |     102B     |  xyz_B |   05  |

1 个答案:

答案 0 :(得分:2)

SELECT service_code, name, price FROM service where service_code not in (102/* set of grouped services */)
union
SELECT service_code || 'A', name || '_A', price-5 FROM service where service_code in (102/* set of grouped services */)
union
SELECT service_code || 'B', name || '_B', price-15 FROM service where service_code in (102/* set of grouped services */);