我有一张表格如下:
ItemNumber - 描述 - 2015年3月31日 - 2015年4月31日 - 2015年5月31日 - 2015年6月31日
========= - ======== - ======== - ======== - ====== == - =========
001 .................. XYZ ..................空............ .... 1000 ...............空................空
002 .................. XYA .................. 2000 ............ ....空............... 3000 ................空
003 .................. XYB ..................空............ .... 4000 ...............空................ 5000
004 .................. XYC .................. 6000 ............ .... 7000 ...............空................空
005 .................. XYD ..................空............ .... 8000 ............... 9000 ................空
006 .................. XYE ..................空............ .... 10000 ...............空................空
=============================================== ====================
如何编写查询以返回值,以便我可以获取具有值(不为空)的字段的列标题,并获取该列标题,如:
ItemNumber - 描述 - 数量 - 日期
========= - ======== - ====== - ====
001 .............. - xyz ........... - 1000 ...... - 2015年4月31日12: 00:00 AM
002 .............. - xya ........... - - 2000 ...... - 03/31/2015 12: 00:00 AM
002 .............. - xya ........... - 3000 ...... - 2015年5月31日12: 00:00 AM
003 .............. - xyb ........... - 4000 ...... - 2015年4月31日12: 00:00 AM
等等...
抱歉可怕的格式化,我无法弄清楚如何在没有点的情况下创建合适的间距。
答案 0 :(得分:1)
您可以使用大量union all
:
select t.*
from (select ItemNumber, Description, '31.03.2015' as date, `31.03.2015` as quantity
from table
union all
select ItemNumber, Description, '31.04.2015' as date, `31.04.2015` as quantity
from table
. . .
) t
where quantity is not null;
在Oracle中,您可以使用双引号而不是反引号来转义列名。
并且,如果您有大量数据,还有其他方式来表达查询,因此您只扫描一次表。