TSQL - 从分组结果中获取其他数据

时间:2017-12-02 12:40:53

标签: sql-server tsql sql-server-2017

我有创建sql查询的问题。 我有一个表,其中包含列&数据:

标识COL1 COL2 COL3 COL4 COL5 COL6 COL7
1 FGA DSA 2018年1月1日7999 DB1 1 0
2 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)我需要调整'其中COL6 = 1'。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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()标识COL4的第一个值,然后将其用于DISTINCT