SQL查询:单独的列,其中ID相同但类型不同

时间:2016-02-08 08:29:26

标签: mysql sql

基本上我从一个简单的选择查询得到这个:

SELECT  Site.RefID, SiteName, Dates.Date, Dates.Type
FROM Site, Dates
WHERE Site.RefID = Dates.RefID; 

RefID | SiteName | Date        | Type
1       Sydney       06-12-15   OPENED
1       Sydney       08-12-15   CLOSED
2       Mel          17-12-15   OPENED
2       Mel          19-12-15   CLOSED

但是我想分开它,所以结果与此相似:

RefID | SiteName | DateOPENED     | DateCLOSED
1       Sydney       06-12-15     | 08-12-15

基本上我想比较数据跟踪细节

如果这个问题没有很好地构建,请提前道歉:/我是一个完整的初学者

我在考虑选择或可能的情况下的选择,但我似乎无法工作

4 个答案:

答案 0 :(得分:0)

在当前查询中添加GROUP BY,在开始日期使用MIN,在结束日期使用MAX

SELECT  Site.RefID, SiteName, MIN(Dates.Date) as DateOPENED, MIN(Dates.Date) as DateCLOSED
FROM Site
  JOIN Dates ON Site.RefID = Dates.RefID
group by fID, SiteName

或者,JOIN一次打开,一次打开:

SELECT  Site.RefID, SiteName, do.Date as DateOPENED, dc.Date as DateCLOSED
FROM Site
  LEFT JOIN (select Refid, Date from Dates where Type = 'OPENED') do ON Site.RefID = do.RefID
  LEFT JOIN (select Refid, Date from Dates where Type = 'CLOSED') dc ON Site.RefID = dc.RefID

答案 1 :(得分:0)

您可以使用条件聚合来获得预期结果:

SELECT  Site.RefID, SiteName, 
        MIN(CASE WHEN Dates.Type = 'OPENED' THEN Dates.Date END) DateOPENED,
        MAX(CASE WHEN Dates.Type = 'CLOSED' THEN Dates.Date END) DateCLOSED
FROM Site
INNER JOIN Dates ON Site.RefID = Dates.RefID
GROUP BY Site.RefID, SiteName 

此外,最好使用显式而不是隐式连接语法。

答案 2 :(得分:0)

使用case表达式尝试以下方法:

select s.RefID
     , s.Name
     , min(case when d.Type == 'OPENED' then d.Date end) as DateOPENED
     , min(case when d.Type == 'CLOSED' then d.Date end) as DateCLOSED
from Site s 
join Dates d on s.RefID = d.RefID
group by s.RefID, s.Name

答案 3 :(得分:0)

SELECT A.RefId, A.SiteName, A.Date DateOpened, B.Date DateClosed
FROM #tbl A JOIN #tbl B
ON A.RefId = B.RefID
AND A.Type = 'OPENED'
AND B.Type = 'CLOSED'

为了简单起见,已将查询替换为#tbl(您可以随时处理它)。