2013-07-24 1 views
0

비슷한 질문을 보았지만이 문제에 대한 해결책을 찾을 수 없습니다. 질문이 있어야 테이블의 엉망으로 곰? 매우 간단합니다.SQL Server는 동일한 테이블의 여러 쿼리를 단일 결과 집합으로 결합합니다.

다음 표가 있습니다.

LDTime      Value 
2013-07-24 00:00:00.000  14.85 
2013-07-24 00:00:00.000  1.339 
2013-07-24 00:15:00.000  95.9 
2013-07-24 00:15:00.000  1.285 
2013-07-24 00:30:00.000  160 
2013-07-24 00:30:00.000  0.952 

행 1,3 및 5는 데이터 유형 중 하나입니다. 2, 4 및 6은 다른 유형입니다. I 하나만 필터 변수 (ParameterIdx)를 변경

SELECT 
    A.LDTime, A.Value As AValue 
FROM  
    Table7 G 
INNER JOIN 
    Table1 A 
INNER JOIN 
    Table2 B ON A.DataSetIdx = B.DataSetIdx 
INNER JOIN 
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx 
INNER JOIN 
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx 
INNER JOIN 
    Table5 E 
INNER JOIN 
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx 
WHERE 
    F.StationIDx = 1 
    AND A.ParameterIdx = 18 
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25' 
ORDER 
    BY A.LDTime 


SELECT 
    A.LDTime, A.Value As BValue 
FROM 
    Table7 G 
INNER JOIN 
    Table1 A 
INNER JOIN 
    Table2 B ON A.DataSetIdx = B.DataSetIdx 
INNER JOIN 
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx 
INNER JOIN 
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx 
INNER JOIN 
    Table5 E 
INNER JOIN 
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx 
WHERE 
    F.StationIDx = 1 
    AND A.ParameterIdx = 19 
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25' 
ORDER BY 
    A.LDTime 

참고 두 쿼리 사이 값 열에 저장된 데이터의 유형을 구별한다 : I은 필터 기준에 기초하여 상기 타입을 검색 할 수있는 다음과 같은 질문이 .

쿼리를 결합하여 하나의 결과 집합을 생성하려면 어떻게합니까? (또는 저장 프로 시저를 사용하므로 여러 쿼리에서이 작업을 수행 할 수 있습니다.)

LDTime      AValue BValue 
2013-07-24 00:00:00.000  14.85 1.339 
2013-07-24 00:15:00.000  95.9  1.285 
2013-07-24 00:30:00.000  160  0.952 

답변

1

이 그것을 수행해야합니다

SELECT a.LDTime 
    , Avalue = MAX(CASE WHEN A.ParameterIdx = 18 THEN A.Value END) 
    , BValue = MAX(CASE WHEN A.ParameterIdx = 19 THEN A.Value END) 
FROM   Table7 G INNER JOIN 
Table1 A INNER JOIN 
Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN 
Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN 
Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN 
Table5 E INNER JOIN 
Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx 
WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19) 
AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25' 
GROUP BY A.LDTime 
ORDER BY A.LDTime 
+0

감사합니다. 나는 오늘 밤 늦게 이것을 시험해 보겠다. 흠, 15 초마다 하나의 댓글 만 허용되었습니다. – MTAdmin

+0

Goat CO와 Gordon Linoff가 질문에 대답했습니다. 염소의 시간은 2 분 더 빨라서 나는 그에게 대답을 줄 것이다. 그러나 둘 모두 동일한 결과를 제공합니다. – MTAdmin

1

유일한 차이점은 where 절 것으로 보인다. 그래서 제대로 행 레이블을해야 다음

SELECT A.LDTime,A.Value, 
     (case when F.StationIDx = 1 AND A.ParameterIdx = 18 then 'A' 
      when A.ParameterIdx = 19 then 'B' 
     end) as AorB 
FROM   Table7 G INNER JOIN 
Table1 A INNER JOIN 
Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN 
Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN 
Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN 
Table5 E INNER JOIN 
Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx 
WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19) 
AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25' 
ORDER BY A.LDTime 

당신이 원하는 일을하려면 쿼리에 group by이 필요합니다. 원하는 결과를 얻을 수 있습니다.

SELECT A.LDTime, 
     max(case when A.ParameterIdx = 18 then Value end) as AValue, 
     max(case when A.ParameterIdx = 19 then Value end) as BValue 
FROM   Table7 G INNER JOIN 
Table1 A INNER JOIN 
Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN 
Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN 
Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN 
Table5 E INNER JOIN 
Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx 
WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19) 
AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25' 
group BY A.LDTime 
order by 1 
관련 문제