我试图弄清楚如何从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
提前感谢您的帮助!
答案 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
列。