如何结合PIVOT和聚合?

时间:2014-05-16 02:04:31

标签: sql-server sql-server-2008

以下是我的示例架构和数据(http://sqlfiddle.com/#!3/0d8b7/3/0):

CREATE TABLE cpv
(
  ClientId INT, 
  CodeName VARCHAR(20), 
  Value VARCHAR(30),
  LastModified DATETIME
);

INSERT INTO cpv (ClientId,CodeName,Value,LastModified)
VALUES
(1000, 'PropA', 'A', '2014-05-15 17:02:00'),
(1000, 'PropB', 'B', '2014-05-15 17:01:00'),
(1000, 'PropC', 'C', '2014-05-15 17:01:00'),
(2000, 'PropA', 'D', '2014-05-15 17:02:00'),
(2000, 'PropB', 'E', '2014-05-15 17:05:00');

我需要将其重塑为:

ClientId PropA PropB PropC LastModified
1000     A     B     C     '2014-05-15 17:02:00'
2000     D     E     NULL  '2014-05-15 17:05:00'

这里涉及两个操作:

  • LastModified的聚合 - 将Max纳入同一ClientId
  • 转动CodeName列

我不知道如何组合它们。

This SQL Fiddle演示了如何转动CodeName列:

SELECT PropA,PropB,PropC
FROM (
  SELECT CodeName,Value FROM cpv
) src
PIVOT (
  MAX(Value)
  FOR CodeName IN (PropA,PropB,PropC)
) p

但它不是由ClientId分组,也不是最终修改的。

This SQL Fiddle演示了ClientId的分组和聚合LastModified:

SELECT ClientId,MAX(LastModified) LastModified
FROM cpv
GROUP BY ClientId

但它完全忽略了Name和Value列。

如何按ClientId进行分组,通过获取组内的Maximum LastModified进行聚合,并在每个组中再次转动CodeName列?

修改

答案可用here

1 个答案:

答案 0 :(得分:0)

试试这个:

;with cte as
(SELECT ClientID,PropA,PropB,PropC
 FROM (
 SELECT ClientID, CodeName,Value FROM cpv
 ) src
 PIVOT (
 MAX(Value)
 FOR CodeName IN (PropA,PropB,PropC)
 ) p)

SELECT DISTINCT cte.ClientID, PropA, PropB, PropC, MAX(LastModified) OVER(PARTITION BY cte.clientid ORDER BY cte.clientid) MaxLastModified FROM cte
INNER JOIN cpv ON cte.clientid = cpv.clientid

演示here