我的数据集与EAV格式不完全相同,但有些相似;以下是数据:
我需要的格式如下:
对于每个EN_NO组,我需要上述格式的数据。如果EN_NO上的组>1,则呼吸产品密钥应转到呼吸产品列,否则不转(例如,EN_NO 4和5)。
我希望我说得够清楚了。数据在Qracle表中,请建议查询以获取我需要的格式的数据。
谢谢,普拉卡什
发布于 2011-12-15 16:31:34
我强烈建议更改您的表结构。目前,您将两条信息绑定到一个字段中。这是一个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
等,那么您需要编写代码来编写代码(Dynamic SQL)。
发布于 2011-12-15 16:38:28
您所显示的是一个数据透视表。如果您想要一个能够自动添加与表中不同数据值对应的列的查询,那么您就不走运了。SQL不支持这一点;在准备查询时--在读取表中的任何数据值之前,列必须是已知的并且是固定的。
为此,您需要获取不同的prod_key值(或者说直到:
字符的子字符串)的列表:
SELECT DISTINCT LEFT(PROD_KEY, 6) FROM yourTable;
然后编写应用程序代码,将这个值列表转换为动态SQL语句中的一系列列表达式,就像@Dem提到的那样。
另一种选择是获取存在于表中的原始数据,然后编写应用程序代码对其进行迭代,并将其分组为表格报表,一次一个数据值。
无论哪种方式,您都需要编写应用程序代码,除非您已经知道要获取的不同prod_key类型的列表。
https://stackoverflow.com/questions/8516710
复制相似问题