2016-09-29 2 views
1
EXTID = 24 일 때 또한 원하는 출력이다 표 T의

부분 집합 :SELECT 값

CID  SDate  Cost 
    1 9/9/2016  70 
    1 9/14/2016  0 
    1 9/16/2016 70 
    2 9/9/2016  0 
    2 9/14/2016 70 
    2 9/16/2016  0 

내가 비용은 당 날짜 기준으로되고 싶어 즉 ExtID = 24 일 때 주어진 날짜에 대한 CID의 비용은 70 일 필요하지만 남은 비용은 주어진 날짜에 0이어야합니다. 금액은 주어진 날짜에 한 번만 70 일 수 있습니다.

검색어 :

SELECT 
    CID 
    ,SDate 
    ,CASE WHEN ExtID = 24 THEN 70 END   
FROM Table T 

이 분명 나에게 내가 CASE 표현을 수정하려면 어떻게합니까 (70) 등의 모든 비용을 줄 것인가?

+1

"EXTID"텍스트에서 참조하고 "EID"가 당신의 SQL 스크립트에 사용됩니다. 그것들은 똑같은 것이나 다른 것을 나타 냅니까? – JohnH

+0

편집 됨 : 쿼리 – AS91

+0

의 ExtID이므로 해당 날짜의 첫 번째 값으로 비용을 설정 하시겠습니까? – Hogan

답변

1

이 날짜는 각 날짜의 최소 CID를 선택하고 해당 레코드에 비용 70을 할당합니다. 같은 날짜이지만 CID가 높은 다른 모든 레코드의 경우 0이 비용으로 지정됩니다.

SELECT DISTINCT t.cid, t.sdate, 
CASE WHEN t.cid = sub.cidmin THEN 70 
ELSE 0 END AS cost 
FROM t 
LEFT JOIN 
(SELECT sdate, MIN(cid) as cidmin 
FROM t 
GROUP BY sdate) sub 
ON t.cid = sub.cidmin 
AND t.sdate = sub.sdate 

여기 테스트 : http://sqlfiddle.com/#!9/72a221/11

0

당신은 이것에 대한 윈도우 기능을 사용할 수 있습니다

SELECT 
    CID 
    ,SDate 
    ,CASE WHEN COUNT(*) OVER (PARTITION BY DATE ORDER BY CID ASCENDING ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 0 AND EID = 24 THEN 70 END   
FROM Table T 

이 CID으로 분류 할 때이 기록되기 전에 표시되는 방식이 날짜의 많은 cound 것입니다. 그것이 0이면 우리는 첫 번째 레코드에 있습니다. 따라서 EID를 테스트하고 70을 스틱에 넣으십시오 (아마도 EID 테스트를 제거 할 수 있지만 필요한 경우 남겨 둡니다).

+0

'ORDER BY CID'에 대해 기본적으로 오름차순으로 표시되지 않습니까? 나는 아직도 모든 결과에 대해 70을 얻고 있습니다. – AS91

+0

예, 가능합니다. 아마도 별도의 열로 사용하십시오 :'COUNT (*) OVER (분할되지 않은 PRCEDING과 1 PRECEDING 사이의 CID 행 순서로 분할) '를 사용하고 계산을 위해 무엇을 얻는 지보십시오. 그런 다음 그 결과에 기초하십시오. – JNevill

+0

각 행마다 개수가 0이므로 비용이 모두 70 인 이유는 무엇입니까? – AS91