2016-02-16 69 views
1

没关系..我在Oracle 10g上,这意味着更新的Oracle版本或其他SQL版本的简易concat函数都不起作用。水平输出sql数据

我正在查看一列(process_date)中有重复的表(工资单)。该数据库是Oracle数据库。

例如表工资:

Yr | Week | Process_date 
15  53  12/19/2015 
15  52  12/19/2015 
15  51  12/7/2015 

我想输出返回与在这样

Yr | Week 1| Week 2 | Process_date 
15  53  52  12/19/2015 

我同一直线上周数有同样的处理日期的周已经尝试了各种子选择和连接,但不能正确地做。

编辑:添加细节 EDIT2:截至话题

+0

?这听起来像是你想“旋转”你的结果。如果知道潜在列的数量,有几种方法可以根据rdbms执行此操作。如果你不知道列的数量,那么你需要使用'动态sql'。 – sgeddes

+0

这是一个交叉表或数据透视查询。如何做到这一点将取决于你正在使用的RDBMS。你应该更新你的问题来标记RDBMS(mysql vs sql-server vs postgresql vs ...) – JNevill

+0

@sgeddes,这正是我试图避免的。我可以将结果导出为ex​​cel并将其转到那里..对我来说更容易 –

回答

1
SELECT Yr, GROUP_CONCAT(Week SEPARATOR ',') Weeks, Process_date 
FROM payroll 
GROUP BY Yr, Process_date; 

这会给你以下的输出:

Yr | Weeks | Process_date 
15 53,52 12/19/2015 

如果必须在单独的列得到他们,你可能需要一个子查询作为跟随。如果您只有一周而不是两个,此查询将无法正常工作。

SELECT Yr, SUBSTRING_INDEX(SUBSTRING_INDEX(Weeks, ',', 1), ',', -1) Week1, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(Weeks, ',', 2), ',', -1) Week2, Process_date 
FROM 
    (SELECT Yr, GROUP_CONCAT(Week SEPARATOR ',') Weeks, Process_date 
    FROM payroll 
    GROUP BY Yr, Process_date) merged_payroll; 

输出:

Yr | Weeks | Process_date 
15 53,52 12/19/2015 
15 51,51 12/7/2015 (DUPLICATED 51) 

参考:(1)How to use GROUP_CONCAT in a CONCAT in MySQL(2)Split value from one field to two您正在使用哪个数据库

+0

这个'SELECT Yr,GROUP_CONCAT(Week SEPARATOR',')Weeks,Process_date'给了我这个错误'ORA-00907 :缺少右括号# –

+0

Nevermind ..我在Oravle 10g上,这意味着非新版Oracle或其他SQL版本的简易concat函数将起作用。感谢您的帮助。 –