all groups > sql server (alternate) > april 2004 >
You're in the

sql server (alternate)

group:

Dynamic Cross Tab Using Cursors.


Dynamic Cross Tab Using Cursors. Jaidev Paruchuri
4/28/2004 2:27:09 PM
sql server (alternate):
I have two tables
1)Rollout_detail
start_date Datetime,
contract_date Datetime,
budget_amt Money
store_id int(foriegn key referring store.store_id)
pan_number varchar(20)
roll_id int

2)store
store_id int(primary key)
skey varchar(10)

these two tables are tied with store_id
and in rollout_detail there can be many pan_numbers for a given
store.(pan_number + store ) are unique.

Now here is the problem.

I need to generate a cross tab report with
store,pan1_contract_date,pan1_budget_amt,pan1_start_date,
pan2_Contract_date,pan2_budget_amt,pan2_start_date and so on.

I tried this with in a procedure.
-----------------------------------------------------------
CREATE PROCEDURE crosstab
@roll_id INT
WITH ENCRYPTION
AS
DECLARE @sql VARCHAR(8000),@panNumber VARCHAR(20)
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
DECLARE al_cursor CURSOR FOR SELECT DISTINCT pan_number AS p_pannumber
FROM rollout_detail WHERE roll_id=@roll_id
OPEN al_cursor
SELECT @sql='SELECT skey, '
FETCH NEXT FROM al_cursor INTO @panNumber
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql=@sql+'(CASE pan_number WHEN
'''+rtrim(@panNumber)+''' THEN start_date END) as
P'+rtrim(@panNumber)+'_sd,(CASE pan_number WHEN
'''+rtrim(@panNumber)+''' THEN budget_amt END) as
P'+rtrim(@panNumber)+'_ba,(CASE pan_number WHEN
'''+rtrim(@panNumber)+''' THEN contract_date END) as
P'+rtrim(@panNumber)+'_cd,'

FETCH NEXT FROM al_cursor INTO @panNumber
END
SELECT @sql=left(@sql, len(@sql)-1)+' '
SELECT @sql=@sql+'FROM rollout_detail rd,store s
WHERE rd.store_id=s.store_id AND roll_id='+cast(@roll_id as varchar)

EXEC (@sql)
CLOSE al_cursor
DEALLOCATE al_cursor
SET ANSI_WARNINGS ON

EXECUTE crosstab 1
-----------------------------------------------------------
I am getting multiple records for the same store
the result set is.

skey pan1_cd pan1_ba pan1_sd pan2_cd pan2_ba pan2_sd
1 12/2/04 400.0 3/4/05 NULL NULL NULL
1 NULL NULL NULL 5/6/04 566.00 3/4/04


I want the result set merged for each store.

Please help,

Thanks a million

*** Sent via Developersdex http://www.developersdex.com ***
Re: Dynamic Cross Tab Using Cursors. Simon Hayes
4/28/2004 7:29:44 PM

[quoted text, click to view]

You're probably looking for something like this - using MAX() and GROUP BY:

select skey,
max(case when ...) as A,
max(case when ...) as B,
....
from
....
where
....
group by skey

Simon

Re: Dynamic Cross Tab Using Cursors. Jaidev Paruchuri
4/28/2004 8:07:00 PM

Simon,

That worked.
Thankyou very much for the solution.
Though it was simple,I was thinking about alternate solutions.I really
appreaciate you guys.

--Jay

*** Sent via Developersdex http://www.developersdex.com ***
AddThis Social Bookmark Button