T-SQL构建一个组的列

时间:2013-12-13 01:15:52

标签: sql sql-server-2008 tsql

我试图弄清楚如何从SQL Server 2008 R2中的表格格式化/分组。我已经绞尽脑汁想要如何做到这一点,但却无法想出办法。这是表格的基本布局

Pkey   Account_No     Contact_Date   Flag   Job
1      10001          2013-12-09     y      apple
2      10001          2013-12-10     n      orange
3      10002          2013-12-02     n      apple
4      10003          2013-12-10     y      pear
5      10003          2013-12-11     n      peach
6      10003          2013-12-12     n      apple

基本上我需要的是输出以某种方式由Account_No组成(仅列出不同的Account_No),但随后按日期排序的contact_dates和flags构建。构建的列理论上可以永远存在。请参阅下表作为输出示例:

Account_No     Contact_Date_1   Flag_1   Job_1   Contact_Date_2   Flag_2   Job_2    Contact_Date_3   Flag_3   Job_3
10001          2013-12-09       y        apple   2013-12-10       n        orange   NULL             NULL     NULL
10002          2013-12-02       n        apple   NULL             NULL     NULL     NULL             NULL     NULL
10003          2013-12-10       y        pear    2013-12-11       n        peach    2013-12-12       n        apple

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这里有个好问题。在编写报告时,我经常遇到类似的问题。

我这样做 -

WITH y AS (
SELECT row_number() over (partition by account_no order by contact_date) AS rn,
       pkey
       , account_no
       , contact_date
       , flag
       , job
  FROM x -- assuming the name of your table is x
)
  SELECT account_no,
         MAX(CASE WHEN rn = 1 THEN contact_date ELSE NULL END) AS contact_date_1,
         MAX(CASE WHEN rn = 1 THEN flag ELSE NULL END) AS flag_1,
         MAX(CASE WHEN rn = 1 THEN job ELSE NULL END) AS job_1,
         MAX(CASE WHEN rn = 2 THEN contact_date ELSE NULL END) AS contact_date_2,
         MAX(CASE WHEN rn = 2 THEN flag ELSE NULL END) AS flag_2,
         MAX(CASE WHEN rn = 2 THEN job ELSE NULL END) AS job_2,
         MAX(CASE WHEN rn = 3 THEN contact_date ELSE NULL END) AS contact_date_3,
         MAX(CASE WHEN rn = 3 THEN flag ELSE NULL END) AS flag_3,
         MAX(CASE WHEN rn = 3 THEN job ELSE NULL END) AS job_3
    FROM y
GROUP BY account_no

可能有一个较短的解决方案,但现在无法想到它。

但要注意 - 这只适用于三个contact_date值。对于更多值,您必须在MAX(..列表中添加另一组SELECT列。