SQL Pivot函数获取top notes字段

标签 sql sql-server sql-server-2008 tsql pivot

请查看此问题以获得更多背景信息:question 1我使用下面的代码使用数据透视函数创建了一个信息列表

  WITH List AS
    (
        SELECT 'x' AS Company, 'Call'    AS ContactType, '01/01/2016' AS StartTime UNION ALL
        SELECT 'x' AS Company, 'Call'    AS ContactType, '02/01/2016' AS StartTime UNION ALL
        SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime UNION ALL
        SELECT 'x' AS Company, 'Email'   AS ContactType, '03/01/2016' AS StartTime UNION ALL
        SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime UNION ALL
        SELECT 'y' AS Company, 'Email'   AS ContactType, '01/02/2016' AS StartTime UNION ALL
        SELECT 'y' AS Company, 'Call'    AS ContactType, '02/02/2016' AS StartTime UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '09/01/2016' AS StartTime UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '24/01/2016' AS StartTime UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime 
    )


    SELECT Company, Call, Meeting, Email
    FROM
    (
      SELECT StartTime, ContactType, Company
        FROM List
    ) L
    PIVOT
    (
      MAX(StartTime)
      FOR ContactType IN (Call, Meeting, Email)
    ) CT

这有助于生成表格结果:

+---------+------------+------------+------------+
| Company |    Call    |  Meeting   |   Email    |
+---------+------------+------------+------------+
| x       | 02/01/2016 | 02/01/2016 | 03/01/2016 |
| y       | 02/02/2016 | 01/01/2016 | 01/02/2016 |
| z       | 24/01/2016 | 10/01/2016 | Null       |
+---------+------------+------------+------------+

我想通过将一个附加列合并到我的原始查询中来更进一步。我想像这样在查询中添加注释:

WITH List AS
    (
        SELECT 'x' AS Company, 'Call'    AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
        SELECT 'x' AS Company, 'Call'    AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
        SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
        SELECT 'x' AS Company, 'Email'   AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
        SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
        SELECT 'y' AS Company, 'Email'   AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
        SELECT 'y' AS Company, 'Call'    AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note 
    )

我想生成的表输出是:

+---------+------------+------------+------------+------------+
| Company |    Call    |  Meeting   |   Email    |    Note    |
+---------+------------+------------+------------+------------+
| x       | 02/01/2016 | 02/01/2016 | 03/01/2016 | blablabla4 |
| y       | 02/02/2016 | 01/01/2016 | 01/02/2016 | blablabla7 |
| z       | 24/01/2016 | 10/01/2016 | Null       | blablabla9 |
+---------+------------+------------+------------+------------+

现在是棘手的一点。我希望根据联系方式选择的笔记是最新的笔记。在第一行注释中:blablabla4 被选中,因为最近的联系是通过电子邮件“03/01/2016”进行的,因此它选择了这条注释。

有没有人知道我如何在不使用子查询我自己的数据的情况下实现这一目标。

最佳答案

您可以使用 ROW_NUMBER() 获取最新的笔记

WITH List AS
    (
        SELECT 'x' AS Company, 'Call'    AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL
        SELECT 'x' AS Company, 'Call'    AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL
        SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL
        SELECT 'x' AS Company, 'Email'   AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL
        SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL
        SELECT 'y' AS Company, 'Email'   AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL
        SELECT 'y' AS Company, 'Call'    AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL
        SELECT 'z' AS Company, 'Call'    AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL
        SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note 
    )
Select Company
      ,Call    = max(case when ContactType='Call'    then StartTime end)
      ,Meeting = max(case when ContactType='Meeting' then StartTime end)
      ,Email   = max(case when ContactType='Email'   then StartTime end)
      ,Note    = max(case when ContactType<>'Email' and RN=1 then Note end)
 From (
        Select *
              ,RN = Row_Number() over (Partition By Company,case when ContactType <>'EMail' then 1 else 0 end Order By StartTime Desc) 
         from List
      ) A
 Group BY Company

返回

Company Call        Meeting     Email       Note
x       02/01/2016  02/01/2016  03/01/2016  blablabla3
y       02/02/2016  01/01/2016  01/02/2016  blablabla7
z       24/01/2016  10/01/2016  NULL        blablabla9

关于SQL Pivot函数获取top notes字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41488352/

相关文章:

sql - SQL中如何获取字符串的第一个字符?

linq - SQL Server 2008 与 2005 Linq 集成

jquery - 创建具有 SP 返回的不同标题的动态框(div)

mysql - MYSQL中列计算对比

sql - 计算具有... SQL 的行数

sql - 将表变量与 sp_executesql 一起使用

SQL服务器2012 : Where are the "ALL SERVER" triggers scripts stored

sql-server - 如何在 XML PATH 查询上创建 View 或函数?

SQL Server 子字符串

sql - LAG 可以和 HAVING 一起使用吗?