2013-11-04 41 views
0

请接受我的道歉,如果这已被问过去,但我已经通过问题,无法找到答案。ingres sql从1表使用案例连接2行到1行

我有多个项目的表如下:

key | type | Code | Date 

    1234 | S  | 10DY | 01/10/2012 
    1234 | E  | 10DY | 31/10/2012 
    12376 | S  | 10DY | 11/10/2012 
    12376 | E  | 10DY | 21/10/2012 

我想提取数据,以便它显示如下:

key | Code | S_Date  | E_Date 

    1234 | 10DY | 01/10/2012 | 31/10/2012 
    12376 | 10DY | 11/10/2012 | 21/10/2012 

目前我有这样的:

SELECT key, code, CASE WHEN type = 'S' THEN Date END AS S_Date, 
CASE WHEN type = 'E' THEN Date END AS E_Date 
FROM Table1 
WHERE code = '10DY' 

回答

0

假设S_Date < E_Date,像这样的事情应该这样做:

SELECT `key`, `code`, MIN(`Date`) AS S_Date, MAX(`Date`) AS E_Date FROM Table1 WHERE code='10DY' GROUP BY `key` 
+0

谢谢你的回应。不幸的是,我得到的错误是select子句中使用的列必须在group子句中使用,然后给出错误的结果。 – user2928556

+0

嗯,我试了一下,并得到了一个错误,因为关键字“键”。所以我纠正了SQL String。它为我提供的数据集工作。 – user2577405

0

仅基于列的名称,并在没有对表的任何规定约束使直觉的一些飞跃,下面应该做什么,你需要:

SELECT s1.key, s1.code, s1.date AS S_date, s2.date AS E_date 
FROM startend s1 LEFT JOIN startend s2 ON s1.key = s2.key AND s1.type <> s2.type 
WHERE s1.date < s2.date OR s2.date IS NULL; 

这个查询手柄有'S'行但还没有'E'行的情况,但它取决于那里只有一个'S'行和一个'E'行用于任何“key”值。

+0

谢谢,我仍然遇到一些问题,试图在源代码中加入它,因为我认为Ingres的处理方式稍有不同,所以我创建了2个数据集并通过SSRS中的查找加入了它们 – user2928556

0

所有你需要的是这条SQL语句:

SELECT key, code, MIN(Date) AS S_Date, MAX(Date) AS E_Date 
FROM Table1 
GROUP BY key, code 

如果你总是有一对行,一个类型=“S”和其他与类型=“E” 随后的改进版本:

SELECT key, code, MIN(Date) AS S_Date, MAX(Date) AS E_Date 
FROM Table1 
GROUP BY key, code 
HAVING count(*) = 2