July 12, 2010 at 8:58 am
To all,
I am in the process of creating my first dynamic cross-tab. I have read all of Jeff Modem's articles and am pretty familiar with creating static cross-tabs. However, I just can't get my head around how to turn this into a dynamic cross-tab. I have a table where I need to split a comma deliminted string into separate rows (creating an id-sequence no) and then apply the associated field with the row. The catch is that each id can have multiple lines, with the comma delimited field having only 8 values, but there can be up to 1200 id-sequence number that will need to be placed in rows.
I have included the setup for a test table, some sample data and the code I have so far. I really want to avoid having to write all of those case statements. The required output is at the bottom.
CREATE TABLE [dbo].[ENC_HIST](
[CLAIM_ID] [varchar](3) NOT NULL,
[CLAIM_SEQUENCE_NUMBERS] [varchar](200) NOT NULL,
[FIRST_DATE_OF_SERVICE_1] [datetime] NULL,
[SERVICE_PROVIDER_NUM_1] [varchar](15) NULL,
[REIMBURSE_IND_1] [varchar](1) NULL,
[AMOUNT_PAID_1] [varchar](9) NULL,
[PROCEDURE_CODE_1] [varchar](7) NULL,
[UNITS_1] [varchar](5) NULL,
[MODIFIER_1] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_2] [datetime] NULL,
[SERVICE_PROVIDER_NUM_2] [varchar](15) NULL,
[REIMBURSE_IND_2] [varchar](1) NULL,
[AMOUNT_PAID_2] [varchar](9) NULL,
[PROCEDURE_CODE_2] [varchar](7) NULL,
[UNITS_2] [varchar](5) NULL,
[MODIFIER_2] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_3] [datetime] NULL,
[SERVICE_PROVIDER_NUM_3] [varchar](15) NULL,
[REIMBURSE_IND_3] [varchar](1) NULL,
[AMOUNT_PAID_3] [varchar](9) NULL,
[PROCEDURE_CODE_3] [varchar](7) NULL,
[UNITS_3] [varchar](5) NULL,
[MODIFIER_3] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_4] [datetime] NULL,
[SERVICE_PROVIDER_NUM_4] [varchar](15) NULL,
[REIMBURSE_IND_4] [varchar](1) NULL,
[AMOUNT_PAID_4] [varchar](9) NULL,
[PROCEDURE_CODE_4] [varchar](7) NULL,
[UNITS_4] [varchar](5) NULL,
[MODIFIER_4] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_5] [datetime] NULL,
[SERVICE_PROVIDER_NUM_5] [varchar](15) NULL,
[REIMBURSE_IND_5] [varchar](1) NULL,
[AMOUNT_PAID_5] [varchar](9) NULL,
[PROCEDURE_CODE_5] [varchar](7) NULL,
[UNITS_5] [varchar](5) NULL,
[MODIFIER_5] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_6] [datetime] NULL,
[SERVICE_PROVIDER_NUM_6] [varchar](15) NULL,
[REIMBURSE_IND_6] [varchar](1) NULL,
[AMOUNT_PAID_6] [varchar](9) NULL,
[PROCEDURE_CODE_6] [varchar](7) NULL,
[UNITS_6] [varchar](5) NULL,
[MODIFIER_6] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_7] [datetime] NULL,
[SERVICE_PROVIDER_NUM_7] [varchar](15) NULL,
[REIMBURSE_IND_7] [varchar](1) NULL,
[AMOUNT_PAID_7] [varchar](9) NULL,
[PROCEDURE_CODE_7] [varchar](7) NULL,
[UNITS_7] [varchar](5) NULL,
[MODIFIER_7] [varchar](3) NULL,
[FIRST_DATE_OF_SERVICE_8] [datetime] NULL,
[SERVICE_PROVIDER_NUM_8] [varchar](15) NULL,
[REIMBURSE_IND_8] [varchar](1) NULL,
[AMOUNT_PAID_8] [varchar](9) NULL,
[PROCEDURE_CODE_8] [varchar](7) NULL,
[UNITS_8] [varchar](5) NULL,
[MODIFIER_8] [varchar](3) NULL,
)
--SAMPLE DATA
--INSERT THE SAMPLE DATA INTO THE TEST TABLE FOR PROCESSING
INSERT INTO ENC_HIST
(
CLAIM_ID,CLAIM_SEQUENCE_NUMBERS,
FIRST_DATE_OF_SERVICE_1,SERVICE_PROVIDER_NUM_1,REIMBURSE_IND_1,AMOUNT_PAID_1,PROCEDURE_CODE_1,UNITS_1,MODIFIER_1,
FIRST_DATE_OF_SERVICE_2,SERVICE_PROVIDER_NUM_2,REIMBURSE_IND_2,AMOUNT_PAID_2,PROCEDURE_CODE_2,UNITS_2,MODIFIER_2,
FIRST_DATE_OF_SERVICE_3,SERVICE_PROVIDER_NUM_3,REIMBURSE_IND_3,AMOUNT_PAID_3 ,PROCEDURE_CODE_3,UNITS_3 ,MODIFIER_3,
FIRST_DATE_OF_SERVICE_4,SERVICE_PROVIDER_NUM_4,REIMBURSE_IND_4,AMOUNT_PAID_4,PROCEDURE_CODE_4,UNITS_4,MODIFIER_4,
FIRST_DATE_OF_SERVICE_5,SERVICE_PROVIDER_NUM_5,REIMBURSE_IND_5,AMOUNT_PAID_5,PROCEDURE_CODE_5,UNITS_5,MODIFIER_5,
FIRST_DATE_OF_SERVICE_6,SERVICE_PROVIDER_NUM_6,REIMBURSE_IND_6,AMOUNT_PAID_6,PROCEDURE_CODE_6,UNITS_6 ,MODIFIER_6,
FIRST_DATE_OF_SERVICE_7,SERVICE_PROVIDER_NUM_7,REIMBURSE_IND_7,AMOUNT_PAID_7,PROCEDURE_CODE_7 ,UNITS_7,MODIFIER_7,
FIRST_DATE_OF_SERVICE_8 ,SERVICE_PROVIDER_NUM_8,REIMBURSE_IND_8,AMOUNT_PAID_8,PROCEDURE_CODE_8,UNITS_8,MODIFIER_8
)
SELECT
'100','1,2,3,4,5,6,7,8',
'2009-01-01 00:00:00','121000','F',6000,'90801',4,NULL,
'2009-01-01 00:00:00','121000','F',5000,'74160',3,NULL,
'2009-01-01 00:00:00','121000','F',3000,'72125',4,NULL,
'2009-01-01 00:00:00','121000','F',70000,'99223',7,NULL ,
'2009-01-01 00:00:00','121000','F',6000,'81025',1,NULL,
'2009-01-01 00:00:00','121000','F',8000,'69210',5,NULL,
'2009-01-01 00:00:00','121000','F',1000,'J2185',1,NULL,
'2009-01-01 00:00:00','121000','F',8000,'31575',7,NULL UNION ALL
SELECT
'100','9,10,11,12,13,14,15,16',
'2009-01-01 00:00:00','121000','F',6000,'90801',4,NULL,
'2009-01-01 00:00:00','121000','F',5000,'74160',3,NULL,
'2009-01-01 00:00:00','121000','F',3000,'72125',4,NULL,
'2009-01-01 00:00:00','121000','F',70000,'99223',7,NULL,
'2009-01-01 00:00:00','121000','F',6000,'81025',1,NULL,
'2009-01-01 00:00:00','121000','F',8000,'69210',5,NULL,
'2009-01-01 00:00:00','121000','F',1000,'J2185',1,NULL,
'2009-01-01 00:00:00','121000','F',8000,'31575',7,NULL UNION ALL
SELECT
'101','1,2,3,4',
'2009-11-21 00:00:00','122000','C',0,'90801',1,NULL,
'2009-11-21 00:00:00','122000','F',500000,'A7015',3,NULL,
'2009-11-21 00:00:00','122000','F',3000,'93306',4,NULL,
'2009-11-21 00:00:00','122000','C',0,'99223',1,NULL,
NULL,NULL,NULL,0,NULL,0,NULL,
NULL,NULL,NULL,0,NULL,0,NULL,
NULL,NULL,NULL,0,NULL,0,NULL,
NULL,NULL,NULL,0,NULL,0,NULL
UNION ALL
SELECT
'103','1,2,3,4,5,6,7,8',
'2009-12-31 00:00:00','123000','F',1000,'90801',4,NULL,
'2009-12-31 00:00:00','123000','F',2000,'74160',3,NULL,
'2009-12-31 00:00:00','123000','F',3000,'72125',4,NULL,
'2009-12-31 00:00:00','123000','F',40000,'99223',7,NULL ,
'2009-12-31 00:00:00','123000','F',5000,'81025',1,NULL,
'2009-12-31 00:00:00','123000','F',6000,'69210',5,NULL,
'2009-12-31 00:00:00','123000','F',8000,'J2185',1,NULL,
'2009-12-31 00:00:00','123000','F',10000,'31575',7,NULL UNION ALL
SELECT
'103','9,10,11,12,13,14,15,16',
'2009-12-31 00:00:00','123000','F',6000,'99204',1,NULL,
'2009-12-31 00:00:00','123000','F',5000,'93306',1,NULL,
'2009-12-31 00:00:00','123000','F',3000,'99244',1,NULL,
'2009-12-31 00:00:00','123000','F',70000,'92507',1,NULL,
'2009-12-31 00:00:00','123000','F',6000,'99212',1,NULL,
'2009-12-31 00:00:00','123000','F',8000,'76856',5,NULL,
'2009-12-31 00:00:00','123000','F',1000,'99243',1,NULL,
'2009-12-31 00:00:00','123000','F',8000,'81003',2,NULL UNION ALL
SELECT
'103','17,18,19,20,21,22,23,24',
'2009-12-31 00:00:00','123000','F',8000,'11040',2,NULL,
'2009-12-31 00:00:00','123000','F',6000,'71020',2,NULL,
'2009-12-31 00:00:00','123000','F',4000,'72125',2,NULL,
'2009-12-31 00:00:00','123000','F',2000,'70553',2,NULL,
'2009-12-31 00:00:00','123000','C',0,'76856',2,NULL,
'2009-12-31 00:00:00','123000','C',0,'69210',4,NULL,
'2009-12-31 00:00:00','123000','C',0,'J2185',6,NULL,
'2009-12-31 00:00:00','123000','C',0,'31575',9,NULL UNION ALL
SELECT
'103','25,26,27,28,29,30,31,32',
'2009-12-31 00:00:00','123000','C',6000,'90801',4,NULL,
'2009-12-31 00:00:00','123000','C',5000,'74160',3,NULL,
'2009-12-31 00:00:00','123000','F',3000,'72125',4,NULL,
'2009-12-31 00:00:00','123000','F',70000,'99223',7,NULL,
'2009-12-31 00:00:00','123000','F',6000,'81025',1,NULL,
'2009-12-31 00:00:00','123000','F',8000,'69210',5,NULL,
'2009-12-31 00:00:00','123000','F',1000,'J2185',1,NULL,
'2009-12-31 00:00:00','123000','F',8000,'31575',7,NULL UNION ALL
SELECT
'103','33,34,35,36,37,38,39,40',
'2009-12-31 00:00:00','121000','F',6000,'V5060',1,NULL,
'2009-12-31 00:00:00','121000','F',5000,'L0630',2,NULL,
'2009-12-31 00:00:00','121000','F',3000,'11042',6,NULL,
'2009-12-31 00:00:00','121000','F',70000,'59430',9,NULL,
'2009-12-31 00:00:00','121000','F',6000,'51700',1,NULL,
'2009-12-31 00:00:00','121000','F',8000,'00918',1,NULL,
'2009-12-31 00:00:00','121000','F',1000,'00440',1,NULL,
'2009-12-31 00:00:00','121000','F',8000,'99123',1,NULL
--QUERY SO FAR (NOTE IS ASSUMES THAT YOU HAVE A TALLY TABLE)
--SELECT THE INDIVIDUAL RECORDS AND ASSIGN THE LINE NUMBER USING THE DATA FILE AND A TALLY TABLE
;with temp_tbl as (
SELECT
CLAIM_ID,
SUBSTRING(','+claim_sequence_numbers+',',N+1,CHARINDEX(',',','+claim_sequence_numbers+',',N+1)-N-1) AS line_no,
FIRST_DATE_OF_SERVICE_1,
SERVICE_PROVIDER_NUM_1,
REIMBURSE_IND_1,
AMOUNT_PAID_1,
PROCEDURE_CODE_1,
UNITS_1,
MODIFIER_1,
FIRST_DATE_OF_SERVICE_2,
SERVICE_PROVIDER_NUM_2,
REIMBURSE_IND_2,
AMOUNT_PAID_2,
PROCEDURE_CODE_2,
UNITS_2,
MODIFIER_2,
FIRST_DATE_OF_SERVICE_3,
SERVICE_PROVIDER_NUM_3,
REIMBURSE_IND_3,
AMOUNT_PAID_3,
PROCEDURE_CODE_3,
UNITS_3,
MODIFIER_3,
FIRST_DATE_OF_SERVICE_4,
SERVICE_PROVIDER_NUM_4,
REIMBURSE_IND_4,
AMOUNT_PAID_4,
PROCEDURE_CODE_4,
UNITS_4,
MODIFIER_4,
FIRST_DATE_OF_SERVICE_5,
SERVICE_PROVIDER_NUM_5,
REIMBURSE_IND_5,
AMOUNT_PAID_5,
PROCEDURE_CODE_5,
UNITS_5,
MODIFIER_5,
FIRST_DATE_OF_SERVICE_6,
SERVICE_PROVIDER_NUM_6,
REIMBURSE_IND_6,
AMOUNT_PAID_6,
PROCEDURE_CODE_6,
UNITS_6,
MODIFIER_6,
FIRST_DATE_OF_SERVICE_7,
SERVICE_PROVIDER_NUM_7,
REIMBURSE_IND_7,
AMOUNT_PAID_7,
PROCEDURE_CODE_7,
UNITS_7,
MODIFIER_7,
FIRST_DATE_OF_SERVICE_8,
SERVICE_PROVIDER_NUM_8,
REIMBURSE_IND_8,
AMOUNT_PAID_8,
PROCEDURE_CODE_8,
UNITS_8,
MODIFIER_8
FROM
dbo.tally
cross join
ENC_HIST
WHERE
N < LEN(','+claim_sequence_numbers+',')
AND SUBSTRING(','+claim_sequence_numbers+',',N,1) = ','
)
--MATCH UP THE LINE NUMBER TO DISTINGUISH INDIVIDUAL LINES
, temp_tbl2 as (
SELECT
LINE_NO,
claim_id,
FIRST_DATE_OF_SERVICE_1,
SERVICE_PROVIDER_NUM_1,
REIMBURSE_IND_1,
AMOUNT_PAID_1,
PROCEDURE_CODE_1,
UNITS_1,
MODIFIER_1,
FIRST_DATE_OF_SERVICE_2,
SERVICE_PROVIDER_NUM_2,
REIMBURSE_IND_2,
AMOUNT_PAID_2,
PROCEDURE_CODE_2,
UNITS_2,
MODIFIER_2,
FIRST_DATE_OF_SERVICE_3,
SERVICE_PROVIDER_NUM_3,
REIMBURSE_IND_3,
AMOUNT_PAID_3,
PROCEDURE_CODE_3,
UNITS_3,
MODIFIER_3,
FIRST_DATE_OF_SERVICE_4,
SERVICE_PROVIDER_NUM_4,
REIMBURSE_IND_4,
AMOUNT_PAID_4,
PROCEDURE_CODE_4,
UNITS_4,
MODIFIER_4,
FIRST_DATE_OF_SERVICE_5,
SERVICE_PROVIDER_NUM_5,
REIMBURSE_IND_5,
AMOUNT_PAID_5,
PROCEDURE_CODE_5,
UNITS_5,
MODIFIER_5,
FIRST_DATE_OF_SERVICE_6,
SERVICE_PROVIDER_NUM_6,
REIMBURSE_IND_6,
AMOUNT_PAID_6,
PROCEDURE_CODE_6,
UNITS_6,
MODIFIER_6,
FIRST_DATE_OF_SERVICE_7,
SERVICE_PROVIDER_NUM_7,
REIMBURSE_IND_7,
AMOUNT_PAID_7,
PROCEDURE_CODE_7,
UNITS_7,
MODIFIER_7,
FIRST_DATE_OF_SERVICE_8,
SERVICE_PROVIDER_NUM_8,
REIMBURSE_IND_8,
AMOUNT_PAID_8,
PROCEDURE_CODE_8,
UNITS_8,
MODIFIER_8,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN1') then line_no end as line_1t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN2') then line_no end as line_2t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN3') then line_no end as line_3t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN4') then line_no end as line_4t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN5') then line_no end as line_5t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN6') then line_no end as line_6t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN7') then line_no end as line_7t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN8') then line_no end as line_8t,
Case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN9') then line_no end as line_9t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN10') then line_no end as line_10t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN11') then line_no end as line_11t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN12') then line_no end as line_12t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN13') then line_no end as line_13t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN14') then line_no end as line_14t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN15') then line_no end as line_15t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN16') then line_no end as line_16t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN17') then line_no end as line_17t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN18') then line_no end as line_18t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN19') then line_no end as line_19t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN20') then line_no end as line_20t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN21') then line_no end as line_21t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN22') then line_no end as line_22t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN23') then line_no end as line_23t,
Case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN24') then line_no end as line_24t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN25') then line_no end as line_25t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN26') then line_no end as line_26t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN27') then line_no end as line_27t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN28') then line_no end as line_28t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN29') then line_no end as line_29t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN30') then line_no end as line_30t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN31') then line_no end as line_31t,
case when ('LN'+cast(row_number()over(partition by claim_id order by claim_id)as char(5))='LN32') then line_no end as line_32t
FROM
temp_tbl
)
--PUT THE RIGHT DETAIL FILEDS WITH EACH LINE NUMBER TO CREATE ONE ROW PER CLAIM_ID LINE NUMBER
, TEMP_TBL3 AS (
SELECT
CLAIM_ID,
CASE
WHEN LINE_1T IS NOT NULL THEN LINE_1T
WHEN LINE_2T IS NOT NULL THEN LINE_2T
WHEN LINE_3T IS NOT NULL THEN LINE_3T
WHEN LINE_4T IS NOT NULL THEN LINE_4T
WHEN LINE_5T IS NOT NULL THEN LINE_5T
WHEN LINE_6T IS NOT NULL THEN LINE_6T
WHEN LINE_7T IS NOT NULL THEN LINE_7T
WHEN LINE_8T IS NOT NULL THEN LINE_8T
WHEN LINE_9T IS NOT NULL THEN LINE_9T
WHEN LINE_10T IS NOT NULL THEN LINE_10T
WHEN LINE_11T IS NOT NULL THEN LINE_11T
WHEN LINE_12T IS NOT NULL THEN LINE_12T
WHEN LINE_13T IS NOT NULL THEN LINE_13T
WHEN LINE_14T IS NOT NULL THEN LINE_14T
WHEN LINE_15T IS NOT NULL THEN LINE_15T
WHEN LINE_16T IS NOT NULL THEN LINE_16T
WHEN LINE_17T IS NOT NULL THEN LINE_17T
WHEN LINE_18T IS NOT NULL THEN LINE_18T
WHEN LINE_19T IS NOT NULL THEN LINE_19T
WHEN LINE_20T IS NOT NULL THEN LINE_20T
WHEN LINE_21T IS NOT NULL THEN LINE_21T
WHEN LINE_22T IS NOT NULL THEN LINE_22T
WHEN LINE_23T IS NOT NULL THEN LINE_23T
WHEN LINE_24T IS NOT NULL THEN LINE_24T
WHEN LINE_25T IS NOT NULL THEN LINE_25T
WHEN LINE_26T IS NOT NULL THEN LINE_26T
WHEN LINE_27T IS NOT NULL THEN LINE_27T
WHEN LINE_28T IS NOT NULL THEN LINE_28T
WHEN LINE_29T IS NOT NULL THEN LINE_29T
WHEN LINE_30T IS NOT NULL THEN LINE_30T
WHEN LINE_31T IS NOT NULL THEN LINE_31T
WHEN LINE_32T IS NOT NULL THEN LINE_32T
ELSE NULL END AS SEQ_NO,
CASE
WHEN LINE_1T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_1
WHEN LINE_2T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_2
WHEN LINE_3T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_3
WHEN LINE_4T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_4
WHEN LINE_5T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_5
WHEN LINE_6T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_6
WHEN LINE_7T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_7
WHEN LINE_8T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_8
WHEN LINE_9T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_1
WHEN LINE_10T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_2
WHEN LINE_11T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_3
WHEN LINE_12T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_4
WHEN LINE_13T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_5
WHEN LINE_14T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_6
WHEN LINE_15T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_7
WHEN LINE_16T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_8
WHEN LINE_17T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_1
WHEN LINE_18T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_2
WHEN LINE_19T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_3
WHEN LINE_20T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_4
WHEN LINE_21T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_5
WHEN LINE_22T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_6
WHEN LINE_23T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_7
WHEN LINE_24T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_8
WHEN LINE_25T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_1
WHEN LINE_26T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_2
WHEN LINE_27T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_3
WHEN LINE_28T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_4
WHEN LINE_29T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_5
WHEN LINE_30T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_6
WHEN LINE_31T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_7
WHEN LINE_32T IS NOT NULL THEN FIRST_DATE_OF_SERVICE_8
ELSE NULL END AS DOS,
CASE
WHEN LINE_1T IS NOT NULL THEN SERVICE_PROVIDER_NUM_1
WHEN LINE_2T IS NOT NULL THEN SERVICE_PROVIDER_NUM_2
WHEN LINE_3T IS NOT NULL THEN SERVICE_PROVIDER_NUM_3
WHEN LINE_4T IS NOT NULL THEN SERVICE_PROVIDER_NUM_4
WHEN LINE_5T IS NOT NULL THEN SERVICE_PROVIDER_NUM_5
WHEN LINE_6T IS NOT NULL THEN SERVICE_PROVIDER_NUM_6
WHEN LINE_7T IS NOT NULL THEN SERVICE_PROVIDER_NUM_7
WHEN LINE_8T IS NOT NULL THEN SERVICE_PROVIDER_NUM_8
WHEN LINE_9T IS NOT NULL THEN SERVICE_PROVIDER_NUM_1
WHEN LINE_10T IS NOT NULL THEN SERVICE_PROVIDER_NUM_2
WHEN LINE_11T IS NOT NULL THEN SERVICE_PROVIDER_NUM_3
WHEN LINE_12T IS NOT NULL THEN SERVICE_PROVIDER_NUM_4
WHEN LINE_13T IS NOT NULL THEN SERVICE_PROVIDER_NUM_5
WHEN LINE_14T IS NOT NULL THEN SERVICE_PROVIDER_NUM_6
WHEN LINE_15T IS NOT NULL THEN SERVICE_PROVIDER_NUM_7
WHEN LINE_16T IS NOT NULL THEN SERVICE_PROVIDER_NUM_8
WHEN LINE_17T IS NOT NULL THEN SERVICE_PROVIDER_NUM_1
WHEN LINE_18T IS NOT NULL THEN SERVICE_PROVIDER_NUM_2
WHEN LINE_19T IS NOT NULL THEN SERVICE_PROVIDER_NUM_3
WHEN LINE_20T IS NOT NULL THEN SERVICE_PROVIDER_NUM_4
WHEN LINE_21T IS NOT NULL THEN SERVICE_PROVIDER_NUM_5
WHEN LINE_22T IS NOT NULL THEN SERVICE_PROVIDER_NUM_6
WHEN LINE_23T IS NOT NULL THEN SERVICE_PROVIDER_NUM_7
WHEN LINE_24T IS NOT NULL THEN SERVICE_PROVIDER_NUM_8
WHEN LINE_25T IS NOT NULL THEN SERVICE_PROVIDER_NUM_1
WHEN LINE_26T IS NOT NULL THEN SERVICE_PROVIDER_NUM_2
WHEN LINE_27T IS NOT NULL THEN SERVICE_PROVIDER_NUM_3
WHEN LINE_28T IS NOT NULL THEN SERVICE_PROVIDER_NUM_4
WHEN LINE_29T IS NOT NULL THEN SERVICE_PROVIDER_NUM_5
WHEN LINE_30T IS NOT NULL THEN SERVICE_PROVIDER_NUM_6
WHEN LINE_31T IS NOT NULL THEN SERVICE_PROVIDER_NUM_7
WHEN LINE_32T IS NOT NULL THEN SERVICE_PROVIDER_NUM_8
ELSE NULL END AS PROV_NUM,
CASE
WHEN LINE_1T IS NOT NULL THEN REIMBURSE_IND_1
WHEN LINE_2T IS NOT NULL THEN REIMBURSE_IND_2
WHEN LINE_3T IS NOT NULL THEN REIMBURSE_IND_3
WHEN LINE_4T IS NOT NULL THEN REIMBURSE_IND_4
WHEN LINE_5T IS NOT NULL THEN REIMBURSE_IND_5
WHEN LINE_6T IS NOT NULL THEN REIMBURSE_IND_6
WHEN LINE_7T IS NOT NULL THEN REIMBURSE_IND_7
WHEN LINE_8T IS NOT NULL THEN REIMBURSE_IND_8
WHEN LINE_9T IS NOT NULL THEN REIMBURSE_IND_1
WHEN LINE_10T IS NOT NULL THEN REIMBURSE_IND_2
WHEN LINE_11T IS NOT NULL THEN REIMBURSE_IND_3
WHEN LINE_12T IS NOT NULL THEN REIMBURSE_IND_4
WHEN LINE_13T IS NOT NULL THEN REIMBURSE_IND_5
WHEN LINE_14T IS NOT NULL THEN REIMBURSE_IND_6
WHEN LINE_15T IS NOT NULL THEN REIMBURSE_IND_7
WHEN LINE_16T IS NOT NULL THEN REIMBURSE_IND_8
WHEN LINE_17T IS NOT NULL THEN REIMBURSE_IND_1
WHEN LINE_18T IS NOT NULL THEN REIMBURSE_IND_2
WHEN LINE_19T IS NOT NULL THEN REIMBURSE_IND_3
WHEN LINE_20T IS NOT NULL THEN REIMBURSE_IND_4
WHEN LINE_21T IS NOT NULL THEN REIMBURSE_IND_5
WHEN LINE_22T IS NOT NULL THEN REIMBURSE_IND_6
WHEN LINE_23T IS NOT NULL THEN REIMBURSE_IND_7
WHEN LINE_24T IS NOT NULL THEN REIMBURSE_IND_8
WHEN LINE_25T IS NOT NULL THEN REIMBURSE_IND_1
WHEN LINE_26T IS NOT NULL THEN REIMBURSE_IND_2
WHEN LINE_27T IS NOT NULL THEN REIMBURSE_IND_3
WHEN LINE_28T IS NOT NULL THEN REIMBURSE_IND_4
WHEN LINE_29T IS NOT NULL THEN REIMBURSE_IND_5
WHEN LINE_30T IS NOT NULL THEN REIMBURSE_IND_6
WHEN LINE_31T IS NOT NULL THEN REIMBURSE_IND_7
WHEN LINE_32T IS NOT NULL THEN REIMBURSE_IND_8
ELSE NULL END AS REIMB,
CASE
WHEN LINE_1T IS NOT NULL THEN AMOUNT_PAID_1
WHEN LINE_2T IS NOT NULL THEN AMOUNT_PAID_2
WHEN LINE_3T IS NOT NULL THEN AMOUNT_PAID_3
WHEN LINE_4T IS NOT NULL THEN AMOUNT_PAID_4
WHEN LINE_5T IS NOT NULL THEN AMOUNT_PAID_5
WHEN LINE_6T IS NOT NULL THEN AMOUNT_PAID_6
WHEN LINE_7T IS NOT NULL THEN AMOUNT_PAID_7
WHEN LINE_8T IS NOT NULL THEN AMOUNT_PAID_8
WHEN LINE_9T IS NOT NULL THEN AMOUNT_PAID_1
WHEN LINE_10T IS NOT NULL THEN AMOUNT_PAID_2
WHEN LINE_11T IS NOT NULL THEN AMOUNT_PAID_3
WHEN LINE_12T IS NOT NULL THEN AMOUNT_PAID_4
WHEN LINE_13T IS NOT NULL THEN AMOUNT_PAID_5
WHEN LINE_14T IS NOT NULL THEN AMOUNT_PAID_6
WHEN LINE_15T IS NOT NULL THEN AMOUNT_PAID_7
WHEN LINE_16T IS NOT NULL THEN AMOUNT_PAID_8
WHEN LINE_17T IS NOT NULL THEN AMOUNT_PAID_1
WHEN LINE_18T IS NOT NULL THEN AMOUNT_PAID_2
WHEN LINE_19T IS NOT NULL THEN AMOUNT_PAID_3
WHEN LINE_20T IS NOT NULL THEN AMOUNT_PAID_4
WHEN LINE_21T IS NOT NULL THEN AMOUNT_PAID_5
WHEN LINE_22T IS NOT NULL THEN AMOUNT_PAID_6
WHEN LINE_23T IS NOT NULL THEN AMOUNT_PAID_7
WHEN LINE_24T IS NOT NULL THEN AMOUNT_PAID_8
WHEN LINE_25T IS NOT NULL THEN AMOUNT_PAID_1
WHEN LINE_26T IS NOT NULL THEN AMOUNT_PAID_2
WHEN LINE_27T IS NOT NULL THEN AMOUNT_PAID_3
WHEN LINE_28T IS NOT NULL THEN AMOUNT_PAID_4
WHEN LINE_29T IS NOT NULL THEN AMOUNT_PAID_5
WHEN LINE_30T IS NOT NULL THEN AMOUNT_PAID_6
WHEN LINE_31T IS NOT NULL THEN AMOUNT_PAID_7
WHEN LINE_32T IS NOT NULL THEN AMOUNT_PAID_8
ELSE NULL END AS AMT_PAID,
CASE
WHEN LINE_1T IS NOT NULL THEN PROCEDURE_CODE_1
WHEN LINE_2T IS NOT NULL THEN PROCEDURE_CODE_2
WHEN LINE_3T IS NOT NULL THEN PROCEDURE_CODE_3
WHEN LINE_4T IS NOT NULL THEN PROCEDURE_CODE_4
WHEN LINE_5T IS NOT NULL THEN PROCEDURE_CODE_5
WHEN LINE_6T IS NOT NULL THEN PROCEDURE_CODE_6
WHEN LINE_7T IS NOT NULL THEN PROCEDURE_CODE_7
WHEN LINE_8T IS NOT NULL THEN PROCEDURE_CODE_8
WHEN LINE_9T IS NOT NULL THEN PROCEDURE_CODE_1
WHEN LINE_10T IS NOT NULL THEN PROCEDURE_CODE_2
WHEN LINE_11T IS NOT NULL THEN PROCEDURE_CODE_3
WHEN LINE_12T IS NOT NULL THEN PROCEDURE_CODE_4
WHEN LINE_13T IS NOT NULL THEN PROCEDURE_CODE_5
WHEN LINE_14T IS NOT NULL THEN PROCEDURE_CODE_6
WHEN LINE_15T IS NOT NULL THEN PROCEDURE_CODE_7
WHEN LINE_16T IS NOT NULL THEN PROCEDURE_CODE_8
WHEN LINE_17T IS NOT NULL THEN PROCEDURE_CODE_1
WHEN LINE_18T IS NOT NULL THEN PROCEDURE_CODE_2
WHEN LINE_19T IS NOT NULL THEN PROCEDURE_CODE_3
WHEN LINE_20T IS NOT NULL THEN PROCEDURE_CODE_4
WHEN LINE_21T IS NOT NULL THEN PROCEDURE_CODE_5
WHEN LINE_22T IS NOT NULL THEN PROCEDURE_CODE_6
WHEN LINE_23T IS NOT NULL THEN PROCEDURE_CODE_7
WHEN LINE_24T IS NOT NULL THEN PROCEDURE_CODE_8
WHEN LINE_25T IS NOT NULL THEN PROCEDURE_CODE_1
WHEN LINE_26T IS NOT NULL THEN PROCEDURE_CODE_2
WHEN LINE_27T IS NOT NULL THEN PROCEDURE_CODE_3
WHEN LINE_28T IS NOT NULL THEN PROCEDURE_CODE_4
WHEN LINE_29T IS NOT NULL THEN PROCEDURE_CODE_5
WHEN LINE_30T IS NOT NULL THEN PROCEDURE_CODE_6
WHEN LINE_31T IS NOT NULL THEN PROCEDURE_CODE_7
WHEN LINE_32T IS NOT NULL THEN PROCEDURE_CODE_8
ELSE NULL END AS PROC_CODE,
CASE
WHEN LINE_1T IS NOT NULL THEN UNITS_1
WHEN LINE_2T IS NOT NULL THEN UNITS_2
WHEN LINE_3T IS NOT NULL THEN UNITS_3
WHEN LINE_4T IS NOT NULL THEN UNITS_4
WHEN LINE_5T IS NOT NULL THEN UNITS_5
WHEN LINE_6T IS NOT NULL THEN UNITS_6
WHEN LINE_7T IS NOT NULL THEN UNITS_7
WHEN LINE_8T IS NOT NULL THEN UNITS_8
WHEN LINE_9T IS NOT NULL THEN UNITS_1
WHEN LINE_10T IS NOT NULL THEN UNITS_2
WHEN LINE_11T IS NOT NULL THEN UNITS_3
WHEN LINE_12T IS NOT NULL THEN UNITS_4
WHEN LINE_13T IS NOT NULL THEN UNITS_5
WHEN LINE_14T IS NOT NULL THEN UNITS_6
WHEN LINE_15T IS NOT NULL THEN UNITS_7
WHEN LINE_16T IS NOT NULL THEN UNITS_8
WHEN LINE_17T IS NOT NULL THEN UNITS_1
WHEN LINE_18T IS NOT NULL THEN UNITS_2
WHEN LINE_19T IS NOT NULL THEN UNITS_3
WHEN LINE_20T IS NOT NULL THEN UNITS_4
WHEN LINE_21T IS NOT NULL THEN UNITS_5
WHEN LINE_22T IS NOT NULL THEN UNITS_6
WHEN LINE_23T IS NOT NULL THEN UNITS_7
WHEN LINE_24T IS NOT NULL THEN UNITS_8
WHEN LINE_25T IS NOT NULL THEN UNITS_1
WHEN LINE_26T IS NOT NULL THEN UNITS_2
WHEN LINE_27T IS NOT NULL THEN UNITS_3
WHEN LINE_28T IS NOT NULL THEN UNITS_4
WHEN LINE_29T IS NOT NULL THEN UNITS_5
WHEN LINE_30T IS NOT NULL THEN UNITS_6
WHEN LINE_31T IS NOT NULL THEN UNITS_7
WHEN LINE_32T IS NOT NULL THEN UNITS_8
ELSE NULL END AS UNITS,
CASE
WHEN LINE_1T IS NOT NULL THEN MODIFIER_1
WHEN LINE_2T IS NOT NULL THEN MODIFIER_2
WHEN LINE_3T IS NOT NULL THEN MODIFIER_3
WHEN LINE_4T IS NOT NULL THEN MODIFIER_4
WHEN LINE_5T IS NOT NULL THEN MODIFIER_5
WHEN LINE_6T IS NOT NULL THEN MODIFIER_6
WHEN LINE_7T IS NOT NULL THEN MODIFIER_7
WHEN LINE_8T IS NOT NULL THEN MODIFIER_8
WHEN LINE_9T IS NOT NULL THEN MODIFIER_1
WHEN LINE_10T IS NOT NULL THEN MODIFIER_2
WHEN LINE_11T IS NOT NULL THEN MODIFIER_3
WHEN LINE_12T IS NOT NULL THEN MODIFIER_4
WHEN LINE_13T IS NOT NULL THEN MODIFIER_5
WHEN LINE_14T IS NOT NULL THEN MODIFIER_6
WHEN LINE_15T IS NOT NULL THEN MODIFIER_7
WHEN LINE_16T IS NOT NULL THEN MODIFIER_8
WHEN LINE_17T IS NOT NULL THEN MODIFIER_1
WHEN LINE_18T IS NOT NULL THEN MODIFIER_2
WHEN LINE_19T IS NOT NULL THEN MODIFIER_3
WHEN LINE_20T IS NOT NULL THEN MODIFIER_4
WHEN LINE_21T IS NOT NULL THEN MODIFIER_5
WHEN LINE_22T IS NOT NULL THEN MODIFIER_6
WHEN LINE_23T IS NOT NULL THEN MODIFIER_7
WHEN LINE_24T IS NOT NULL THEN MODIFIER_8
WHEN LINE_25T IS NOT NULL THEN MODIFIER_1
WHEN LINE_26T IS NOT NULL THEN MODIFIER_2
WHEN LINE_27T IS NOT NULL THEN MODIFIER_3
WHEN LINE_28T IS NOT NULL THEN MODIFIER_4
WHEN LINE_29T IS NOT NULL THEN MODIFIER_5
WHEN LINE_30T IS NOT NULL THEN MODIFIER_6
WHEN LINE_21T IS NOT NULL THEN MODIFIER_7
WHEN LINE_32T IS NOT NULL THEN MODIFIER_8
ELSE NULL END AS MOD_CD
FROM TEMP_TBL2
)
--GENERATE THE OUTPUT IN THE CORRECT FOMAT
SELECT
CLAIM_ID,
SEQ_NO,
DOS,
PROV_NUM,
REIMB,
AMT_PAID,
PROC_CODE,
UNITS,
MOD_CD
FROM TEMP_TBL3
WHERE
SEQ_NO IS NOT NULL
AND reimb is not null
ORDER BY
CLAIM_ID,
SEQ_NO
REQUIRED OUTPUT
CLAIM_ID SEQ_NO DOS PROV_NUM REIMB AMT_PAID PROC_CODE UNITS MOD_CD
10012009-01-01 00:00:00.000121000F6000908014NULL
100102009-01-01 00:00:00.000121000F5000741603NULL
100112009-01-01 00:00:00.000121000F3000721254NULL
100122009-01-01 00:00:00.000121000F70000992237NULL
100132009-01-01 00:00:00.000121000F6000810251NULL
100142009-01-01 00:00:00.000121000F8000692105NULL
100152009-01-01 00:00:00.000121000F1000J21851NULL
100162009-01-01 00:00:00.000121000F8000315757NULL
10022009-01-01 00:00:00.000121000F5000741603NULL
10032009-01-01 00:00:00.000121000F3000721254NULL
10042009-01-01 00:00:00.000121000F70000992237NULL
10052009-01-01 00:00:00.000121000F6000810251NULL
10062009-01-01 00:00:00.000121000F8000692105NULL
10072009-01-01 00:00:00.000121000F1000J21851NULL
10082009-01-01 00:00:00.000121000F8000315757NULL
10092009-01-01 00:00:00.000121000F6000908014NULL
10112009-11-21 00:00:00.000122000C0908011NULL
10122009-11-21 00:00:00.000122000F500000A70153NULL
10132009-11-21 00:00:00.000122000F3000933064NULL
10142009-11-21 00:00:00.000122000C0992231NULL
10312009-12-31 00:00:00.000123000F1000908014NULL
103102009-12-31 00:00:00.000123000F5000933061NULL
103112009-12-31 00:00:00.000123000F3000992441NULL
103122009-12-31 00:00:00.000123000F70000925071NULL
103132009-12-31 00:00:00.000123000F6000992121NULL
103142009-12-31 00:00:00.000123000F8000768565NULL
103152009-12-31 00:00:00.000123000F1000992431NULL
103162009-12-31 00:00:00.000123000F8000810032NULL
103172009-12-31 00:00:00.000123000F8000110402NULL
103182009-12-31 00:00:00.000123000F6000710202NULL
103192009-12-31 00:00:00.000123000F4000721252NULL
10322009-12-31 00:00:00.000123000F2000741603NULL
103202009-12-31 00:00:00.000123000F2000705532NULL
103212009-12-31 00:00:00.000123000C0768562NULL
103222009-12-31 00:00:00.000123000C0692104NULL
103232009-12-31 00:00:00.000123000C0J21856NULL
103242009-12-31 00:00:00.000123000C0315759NULL
103252009-12-31 00:00:00.000123000C6000908014NULL
103262009-12-31 00:00:00.000123000C5000741603NULL
103272009-12-31 00:00:00.000123000F3000721254NULL
103282009-12-31 00:00:00.000123000F70000992237NULL
103292009-12-31 00:00:00.000123000F6000810251NULL
10332009-12-31 00:00:00.000123000F3000721254NULL
103302009-12-31 00:00:00.000123000F8000692105NULL
103312009-12-31 00:00:00.000123000F1000J21851NULL
103322009-12-31 00:00:00.000123000F8000315757NULL
10342009-12-31 00:00:00.000123000F40000992237NULL
10352009-12-31 00:00:00.000123000F5000810251NULL
10362009-12-31 00:00:00.000123000F6000692105NULL
10372009-12-31 00:00:00.000123000F8000J21851NULL
10382009-12-31 00:00:00.000123000F10000315757NULL
10392009-12-31 00:00:00.000123000F6000992041NULL
Sorry for such a long post but I wanted to make sure I included everything necessary for someone to point me in the correct direction.
Thanks so much,
Sue B
July 12, 2010 at 11:05 am
Do a search on phrase "Dynamic Pivot". See if that helps you out. Then post back on this thread with further questions about it.
July 12, 2010 at 11:24 am
Thanks for the suggestion Brandie. However, doesn't pivot require you to do some sort of aggregation ? My problem doesn't require any aggregaton which is why I was trying to use a cross tab.
The biggest problem, for me anyway, is that the "line numbers" are variable but the fields in each row are not. I am having trouble making that work without writing case statements for each group of eight. I am just not seeing the light yet.
Thanks,
Sue B
July 12, 2010 at 11:32 am
Ah. Yes. Pivot does require aggregation. Sorry. I didn't realize that's what you're doing.
Hmm. Now I'm wondering if there's a way to trick Pivot into doing an aggregation that isn't used and doesn't mess up the data...
What I did on a 2000 Server once is to create a bunch of views with CASE statements and JOIN the views all together. It was a bit bulky, but it did work.
Create View dbo.MyView1 AS
Select Col1, Col2, Case col3 When 'A' Then 1 End as MyChoice1
from dbo.MyTable
GO
Create View dbo.MyView2 AS
Select Col1, Col2, Case col3 When 'B' Then 2 End as MyChoice2
from dbo.MyTable
GO
Create View dbo.MyView3 AS
Select Col1, Col2, Case col3 When 'C' Then 3 End as MyChoice3
from dbo.MyTable
GO
Select Col1, Col2, MyChoice1, MyChoice2, MyChoice3
from MyView1 v1
join MyView2 v2
on v1.Col1 = v2.Col1
join MyView3 v3
on v1.Col1 = v3.Col1;
Be aware my pseudo-code is not the best. I think I was actually "un-pivoting" a table instead of cross-tabbing/pivoting it and I'm working off memory from code I don't currently have access to. There may be a better way to do this, but this is what I recall doing.
July 12, 2010 at 1:41 pm
Would the following dynamic SQL help you?
DECLARE @sql VARCHAR(6000)
DECLARE @sql1 VARCHAR(500)
DECLARE @sql2 VARCHAR(5000)
DECLARE @sql3 VARCHAR(500)
SET @sql1='
;with cte_group_of8 as
(
SELECT
ROW_NUMBER() OVER(PARTITION BY claim_id ORDER BY cast(left(claim_sequence_numbers + '','',charindex('','',claim_sequence_numbers)-1) as int)) - 1 as grp,*
FROM ENC_HIST
)
'
SET @sql3=' ORDER BY Claim_ID, Seq'
SET @sql2=''
SELECT @sql2 =@sql2 +
'UNION ALL
SELECT
Claim_ID,
cte_group_of8.grp * 8 + '+CAST(n AS CHAR(1)) +'as Seq,
[FIRST_DATE_OF_SERVICE_'+CAST(n AS CHAR(1))+'],
[SERVICE_PROVIDER_NUM_'+CAST(n AS CHAR(1))+'] ,
[REIMBURSE_IND_'+CAST(n AS CHAR(1))+'] ,
[AMOUNT_PAID_'+CAST(n AS CHAR(1))+'] ,
[PROCEDURE_CODE_'+CAST(n AS CHAR(1))+'] ,
[UNITS_'+CAST(n AS CHAR(1))+'] ,
[MODIFIER_'+CAST(n AS CHAR(1))+']
FROM cte_group_of8
WHERE [FIRST_DATE_OF_SERVICE_'+CAST(n AS CHAR(1))+'] IS NOT NULL
'
FROM tally
WHERE n>0 AND n<9
SET @sql= @sql1 + STUFF(@sql2,1,11,'') + @sql3
PRINT @sql
--EXEC(@sql)
As a side note:
[SET sarcasm ON]
If you're currently reading a rather heavy book (about normalization, preferrably), make sure to "hand it over right on to the head" of the person that came up with such a "remarkable" (:sick:) table design. And make sure to use as much force as possible. If you miss, give it a second go. If not, well... even then. :sick:
[SET sarcasm OFF]
July 13, 2010 at 4:37 am
Lutz,
Thanks so much. I just couldn't figure out how to get the line numbers to go with the fields. I don't have any control over the table schema as it is determined by an unnamed government entity and I have been using foul language ever since I was assigned this project (which also includes actuaries - so you can imagine my frustration). I have several other tables with the same "design" so it is going to be a fun summer.
I can't thank you again for helping me out.
Sue B
July 13, 2010 at 10:49 pm
Brandie Tarvin (7/12/2010)
Do a search on phrase "Dynamic Pivot". See if that helps you out. Then post back on this thread with further questions about it.
Pivots are generally slower (and uglier, IMHO) than a nice simple "Cross Tab", Brandie. Take a look if you haven't already seen it)...
http://www.sqlservercentral.com/articles/T-SQL/63681/
http://www.sqlservercentral.com/articles/Crosstab/65048/
--Jeff Moden
Change is inevitable... Change for the better is not.
July 13, 2010 at 10:53 pm
LutzM (7/12/2010)
Would the following dynamic SQL help you?
DECLARE @sql VARCHAR(6000)
DECLARE @sql1 VARCHAR(500)
DECLARE @sql2 VARCHAR(5000)
DECLARE @sql3 VARCHAR(500)
SET @sql1='
;with cte_group_of8 as
(
SELECT
ROW_NUMBER() OVER(PARTITION BY claim_id ORDER BY cast(left(claim_sequence_numbers + '','',charindex('','',claim_sequence_numbers)-1) as int)) - 1 as grp,*
FROM ENC_HIST
)
'
SET @sql3=' ORDER BY Claim_ID, Seq'
SET @sql2=''
SELECT @sql2 =@sql2 +
'UNION ALL
SELECT
Claim_ID,
cte_group_of8.grp * 8 + '+CAST(n AS CHAR(1)) +'as Seq,
[FIRST_DATE_OF_SERVICE_'+CAST(n AS CHAR(1))+'],
[SERVICE_PROVIDER_NUM_'+CAST(n AS CHAR(1))+'] ,
[REIMBURSE_IND_'+CAST(n AS CHAR(1))+'] ,
[AMOUNT_PAID_'+CAST(n AS CHAR(1))+'] ,
[PROCEDURE_CODE_'+CAST(n AS CHAR(1))+'] ,
[UNITS_'+CAST(n AS CHAR(1))+'] ,
[MODIFIER_'+CAST(n AS CHAR(1))+']
FROM cte_group_of8
WHERE [FIRST_DATE_OF_SERVICE_'+CAST(n AS CHAR(1))+'] IS NOT NULL
'
FROM tally
WHERE n>0 AND n<9
SET @sql= @sql1 + STUFF(@sql2,1,11,'') + @sql3
PRINT @sql
--EXEC(@sql)
As a side note:
[SET sarcasm ON]
If you're currently reading a rather heavy book (about normalization, preferrably), make sure to "hand it over right on to the head" of the person that came up with such a "remarkable" (:sick:) table design. And make sure to use as much force as possible. If you miss, give it a second go. If not, well... even then. :sick:
[SET sarcasm OFF]
Dang, Lutz... looks like I'm going to have to turn the "doesn't use RBAR, KISS it instead" crown over to you, Lutz. Very well done.
What's next... my mighty "Crosstab Decoder Ring"?
--Jeff Moden
Change is inevitable... Change for the better is not.
July 14, 2010 at 11:45 am
Jeff Moden (7/13/2010)
...Dang, Lutz... looks like I'm going to have to turn the "doesn't use RBAR, KISS it instead" crown over to you, Lutz. Very well done.
What's next... my mighty "Crosstab Decoder Ring"?
Thanx for the flowers. :blush:
But, there's no reason to turn over one of your numerous crowns. Just add another one instead: "One of the best mentors". Or who do you think I learned all that stuff from originally? Based on your response it seems like I finally figured how that stuff works
Viewing 9 posts - 1 through 8 (of 8 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy