与rows-to-col(EAV到关系)类似 - 请查询SQL查询

时间:2011-12-15 07:47:16

标签: sql plsql pivot-table entity-attribute-value

我的数据集与EAV格式不完全相同,但有点类似;这是数据:

original data

我需要的格式如下:

data format needed

对于每个EN_NO组,我需要上述格式的数据。如果EN_NO上的组> 1然后,respetive产品密钥应该转到respetive产品列,否则不会(例如EN_NO 4和5)。

我希望我很清楚。数据在Qracle表中,请建议查询以我需要的格式获取数据。

谢谢, 普拉卡什

2 个答案:

答案 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类型的列表。