我的数据集与EAV格式不完全相同,但有点类似;这是数据:
我需要的格式如下:
对于每个EN_NO组,我需要上述格式的数据。如果EN_NO上的组> 1然后,respetive产品密钥应该转到respetive产品列,否则不会(例如EN_NO 4和5)。
我希望我很清楚。数据在Qracle表中,请建议查询以我需要的格式获取数据。
谢谢, 普拉卡什
答案 0 :(得分:0)
我强烈建议您更改表格结构。目前,您将两条信息绑定到一个字段中。这是一个SQL反模式,破坏了Oracle使用某些优化的能力。
相反,请考虑将“PROD_KEY”拆分为两个字段(PRODUCT_TYPE = Prod_A等)(SUB_PRODUCT_ID = 1,2,3等)。或者,为了减少整个数据库的潜在变化,只需将PRODUCT_TYPE添加到当前表中即可。
那就是说,用你当前的结构......
SELECT
EN_NO,
PROD_KEY,
CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_A') THEN PROD_KEY ELSE NULL END AS Prod_A,
CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_B') THEN PROD_KEY ELSE NULL END AS Prod_B,
CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_C') THEN PROD_KEY ELSE NULL END AS Prod_C,
PROD_QTY
FROM
yourTable
当您具体了解输出所需的列时,此方法有效。如果您需要代码来适应Prod_D
等,那么您需要编写编写代码的代码(动态SQL)。
答案 1 :(得分:0)
您展示的是数据透视表。如果您想要一个自动添加与表中不同数据值对应的列的查询,那么您就不走运了。 SQL不支持这个;在准备查询时必须知道并修复列 - 在读取表中的任何数据值之前。
要执行此操作,您需要获取不同prod_key值的列表(或直到:
字符的子字符串):
SELECT DISTINCT LEFT(PROD_KEY, 6) FROM yourTable;
然后编写应用程序代码,将这个值列表转换为动态SQL语句中的一系列列表达式,如@Dems所述。
另一个选项是获取表中存在的原始数据,然后编写迭代它的应用程序代码,并将其一次分组到表格报告中一个数据值。
无论哪种方式,您都需要编写应用程序代码,除非您已经知道要获取的不同prod_key类型的列表。