2017-12-02 17 views
2

SQL 쿼리를 생성하는 데 문제가 있습니다. I가 열을 & 데이터를 포함하는 하나 개의 테이블 :TSQL - groupped 결과에서 추가 데이터 얻기

이드   COL1 COL2       COL3     COL4   COL5   COL6   COL7  
1   FGA     DSA     2018년 1월 1일  을 DB1   FGA     DSA     2018년 1월 1일   DB1   6999     0       0
3   FGA     DSA     2018년 1월 1일   DB2   5999     1       1

검색어가 있습니다.

SELECT t.COL3, t.COL1, t.COL2, STRING_AGG (c.COL4, ','), min(c.COL5) 
FROM Offers as t 
JOIN Offers as c on t.Id = c.Id 
where t.COL3 between '2017-12-01' and '2017-12-31' 
and t.COL1='FGA' 
GROUP BY t.COL3, t.COL1, t.COL2 

그러나 STRING_AGG (c.COL4, ',')에 대해 고유 한 값이 필요하며 min (c.COL5)에 대해 'where COL6 = 1'을 조건 지정해야합니다. 어떻게하면 될까요?

답변

2

STRING_AGG() (아직) DISTINCT을 지원하지 않습니다. 당신은 조건부 집계와 함께 원하는 것을 할 수 있습니다

SELECT t.COL3, t.COL1, t.COL2, 
     STRING_AGG(CASE WHEN seqnum = 1 THEN c.COL4 END, ','), 
     MIN(CASE WHEN c.col6 = 1 THEN c.COL5 END) 
FROM (SELECT t.COL1, t.COL2, t.COL3, c.COL4, c.COL5, c.col6, 
      ROW_NUMBER() OVER (PARTITION BY t.COL3, t.COL1, t.COL2, t.COL4 ORDER BY c.COL4) as seqnum 
     FROM Offers t JOIN 
      Offers c 
      ON t.Id = c.Id 
     WHERE t.GenerationId = 1 AND 
      t.COL3 between '2017-12-01' and '2017-12-31' AND 
      t.COL1 = 'FGA' 
     GROUP BY t.COL3, t.COL1, t.COL2 
    ) to 
GROUP BY t.COL3, t.COL1, t.COL2; 

ROW_NUMBER()의 사용은 다음 DISTINCT에 사용되는 COL4의 첫 번째 값을 식별 할 수 있습니다.

+0

정확히 작동하지는 않지만이 힌트를 통해 나는 이것을 관리했습니다. 감사! – Mateusz