Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
carmitage
Starting Member
8 Posts |
Posted - 2008-09-11 : 16:01:20
|
| Basically, I have a horizontal and a vertical table. I want to update the horizontal with the vertical. I have limited this to 3 fields. There are actually about 30 so the simpler the better.This is what I want to do, but sql doesn't allow multiple fields in the set statement like this:Update ALM.dbo.QRM_VALUATION_ANALYSIS_test1 Set (DN100_$_DELTA,DN200_$_DELTA,DN300_$_DELTA) = (select (case VSCENID when 4 then amount else 0 end) DN100_$_DELTA, (case VSCENID when 5 then amount else 0 end) DN200_$_DELTA, (case VSCENID when 6 then amount else 0 end) DN300_$_DELTA from QRM_VALUATION_ANALYSIS_TEST_TEMP where QRM_VALUATION_ANALYSIS_TEST_TEMP.COMPID = QRM_VALUATION_ANALYSIS_test1.COMPID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PORTID = QRM_VALUATION_ANALYSIS_test1.PORTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PANLYID = QRM_VALUATION_ANALYSIS_test1.PANLYID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.accountid = QRM_VALUATION_ANALYSIS_test1.accountid AND QRM_VALUATION_ANALYSIS_TEST_TEMP.BCKTID = QRM_VALUATION_ANALYSIS_test1.BCKTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.CF_TYPE =1 )where exists (select amount from QRM_VALUATION_ANALYSIS_TEST_TEMP where QRM_VALUATION_ANALYSIS_TEST_TEMP.COMPID = QRM_VALUATION_ANALYSIS_test1.COMPID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PORTID = QRM_VALUATION_ANALYSIS_test1.PORTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PANLYID = QRM_VALUATION_ANALYSIS_test1.PANLYID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.accountid = QRM_VALUATION_ANALYSIS_test1.accountid AND QRM_VALUATION_ANALYSIS_TEST_TEMP.BCKTID = QRM_VALUATION_ANALYSIS_test1.BCKTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.CF_TYPE =1 )Currently, I have this update for each field:Update ALM.dbo.QRM_VALUATION_ANALYSIS_test1Set UP100_$_DELTA = (select amount from QRM_VALUATION_ANALYSIS_TEST_TEMP where QRM_VALUATION_ANALYSIS_TEST_TEMP.COMPID = QRM_VALUATION_ANALYSIS_test1.COMPID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PORTID = QRM_VALUATION_ANALYSIS_test1.PORTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PANLYID = QRM_VALUATION_ANALYSIS_test1.PANLYID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.accountid = QRM_VALUATION_ANALYSIS_test1.accountid AND QRM_VALUATION_ANALYSIS_TEST_TEMP.BCKTID = QRM_VALUATION_ANALYSIS_test1.BCKTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.CF_TYPE =1 AND QRM_VALUATION_ANALYSIS_TEST_TEMP.VSCENID = 1)where exists (select amount from QRM_VALUATION_ANALYSIS_TEST_TEMP where QRM_VALUATION_ANALYSIS_TEST_TEMP.COMPID = QRM_VALUATION_ANALYSIS_test1.COMPID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PORTID = QRM_VALUATION_ANALYSIS_test1.PORTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.PANLYID = QRM_VALUATION_ANALYSIS_test1.PANLYID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.accountid = QRM_VALUATION_ANALYSIS_test1.accountid AND QRM_VALUATION_ANALYSIS_TEST_TEMP.BCKTID = QRM_VALUATION_ANALYSIS_test1.BCKTID AND QRM_VALUATION_ANALYSIS_TEST_TEMP.CF_TYPE =1 AND QRM_VALUATION_ANALYSIS_TEST_TEMP.VSCENID = 1)It works, but it takes a very long time. Any ideas how to make this work better and more simply? |
|
|
Vinnie881
Master Smack Fu Yak Hacker
1231 Posts |
Posted - 2008-09-11 : 18:22:46
|
Your explanation is not extremly clear, but let me know if this is what you are looking for.Update aset a.UP100_$_DELTA = case when b.VSCENID = 4 then b.Amount else a.UP100_$_DELTA end ,a.UP200_$_DELTA = case when b.VSCENID = 5 then b.Amount else a.UP200_$_DELTA end ,a.UP300_$_DELTA = case when b.VSCENID = 6 then b.Amount else a.UP300_$_DELTA endfrom ALM.dbo.QRM_VALUATION_ANALYSIS_test1 aInner Join QRM_VALUATION_ANALYSIS_TEST_TEMP bon a.CompID = b.CompIDand a.PortID = b.PortIDand a.PANLYID = b.PanlyIDand a.accountId = b.AccountIDand a.BcktID = b.bcktIDand b.CF_TYPE = 1 -- Not sure if this item is related to the column--and b.VSCENID = 1 --U have the #1 on your query, but in your mock case statement you have 4 = UP100?? Success is 10% Intelligence, 70% Determination, and 22% Stupidity.\_/ _/ _/\_/ _/\_/ _/ _/- 881 |
 |
|
|
carmitage
Starting Member
8 Posts |
Posted - 2008-09-16 : 11:44:55
|
| Yes, thank you. I appreciate your help.It partially works. Running this...Update aset a.UP100_$_DELTA = case when b.VSCENID = 4 then b.Amount end ,a.UP200_$_DELTA = case when b.VSCENID = 5 then b.Amount end ,a.UP300_$_DELTA = case when b.VSCENID = 6 then b.Amount end from ALM.dbo.QRM_VALUATION_ANALYSIS_test aInner Join ALM.dbo.QRM_VALUATION_ANALYSIS_TEST_TEMP bon a.CompID = b.CompIDand a.PortID = b.PortIDand a.PANLYID = b.PanlyIDand a.accountId = b.AccountIDand a.BcktID = b.bcktIDand b.CF_TYPE = 1 It updates UP200_$_DELTA, but not the other two. I have turned the update into a select statement so the from is exactly the same and there is an amount for VSCENID = 4 and 6. It doesn't appear to be the data. If I comment out the two other case statements it doesn't update either. Any ideas? |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-09-16 : 11:49:38
|
| just give some sample data to illustrate your scenario and then explain output you want |
 |
|
|
carmitage
Starting Member
8 Posts |
Posted - 2008-09-16 : 14:40:28
|
| SELECT [COMPID] ,[PORTID] ,[MRKTID] ,[ASMPID] ,[CYCLID] ,[ACCOUNTID] ,[BCKTID] ,[UP100_$_DELTA] ,[UP200_$_DELTA] ,[UP300_$_DELTA] FROM [ALM].[dbo].[QRM_VALUATION_ANALYSIS_test]SELECT [COMPID] ,[PORTID] ,[MRKTID] ,[ASMPID] ,[CYCLID] ,[PANLYID] ,[ACCOUNTID] ,[BCKTID] ,[CF_TYPE] ,[VSCENID] ,[AMOUNT] FROM [ALM].[dbo].[QRM_VALUATION_ANALYSIS_TEST_TEMP]I want to update UP100_$_DELTA, UP200_$_DELTA, UP300_$_DELTA in the QRM_VALUATION_ANALYSIS_TEST table with the amount from the QRM_VALUATION_ANALYSIS_TEST_TEMP table. If QRM_VALUATION_ANALYSIS_TEST_TEMP.vscenid = 4, I want to update QRM_VALUATION_ANALYSIS_TEST.UP100_$_DELTA field with QRM_VALUATION_ANALYSIS_TEST_TEMP.amount.If QRM_VALUATION_ANALYSIS_TEST_TEMP.vscenid = 5, I want to update QRM_VALUATION_ANALYSIS_TEST.UP200_$_DELTA field with QRM_VALUATION_ANALYSIS_TEST_TEMP.amount. If QRM_VALUATION_ANALYSIS_TEST_TEMP.vscenid = 6, I want to update QRM_VALUATION_ANALYSIS_TEST.UP300_$_DELTA field with QRM_VALUATION_ANALYSIS_TEST_TEMP.amount.So QRM_VALUATION_ANALYSIS_TEST_TEMP looks like:Accountid vscenid amount1 4 10.00 1 5 25.001 6 45.00I want QRM_VALUATION_ANALYSIS_TEST to look like:Accountid UP100_$_DELTA UP200_$_DELTA UP300_$_DELTA1 10.00 25.00 45.00 |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-09-17 : 03:20:34
|
| [code]UPDATE t1SET t1.[UP100_$_DELTA]=t2.[AMOUNT4],t1.[UP200_$_DELTA]=t2.[AMOUNT5],t1.[UP300_$_DELTA]=t2.[AMOUNT6]FROM [ALM].[dbo].[QRM_VALUATION_ANALYSIS_test] t1INNER JOIN (SELECT [PORTID],[MRKTID],[ASMPID],[CYCLID],[ACCOUNTID],[BCKTID],,MAX(CASE WHEN [VSCENID]=4 THEN [AMOUNT] ELSE NUL END) AS AMOUNT4,MAX(CASE WHEN [VSCENID]=5 THEN [AMOUNT] ELSE NUL END) AS AMOUNT5,MAX(CASE WHEN [VSCENID]=6 THEN [AMOUNT] ELSE NUL END) AS AMOUNT6FROM [ALM].[dbo].[QRM_VALUATION_ANALYSIS_TEST_TEMP]GROUP BY [PORTID],[MRKTID],[ASMPID],[CYCLID],[ACCOUNTID],[BCKTID]) t2ON t2.[PORTID]=t1.[PORTID]AND t2.[MRKTID]=t1.[MRKTID]AND t2.[ASMPID]=t1.[ASMPID]AND t2.[CYCLID]=t1.[CYCLID]AND t2.[ACCOUNTID]=t1.[ACCOUNTID]AND t2.[BCKTID]=t1.[BCKTID][/code] |
 |
|
|
carmitage
Starting Member
8 Posts |
Posted - 2008-09-17 : 15:07:36
|
| Thank you very much. That's actually quite similar to what I was able to come up with.Update main_tableset main_table.UP100_$_DELTA = delta_u100,main_table.UP200_$_DELTA = delta_u200,main_table.UP300_$_DELTA = delta_u300fromALM.dbo.QRM_VALUATION_ANALYSIS_test main_tableJoin(select COMPID,PORTID,PANLYID , accountid , BCKTID, sum(case VSCENID when 1 then amount else 0 end) delta_u100, sum(case VSCENID when 2 then amount else 0 end) delta_u200, sum(case VSCENID when 3 then amount else 0 end) delta_u300from ALM.dbo.QRM_VALUATION_ANALYSIS_TEST_TEMP temp_tablewhere temp_table.CF_TYPE =1 group by COMPID,PORTID,PANLYID , accountid , BCKTID) select_dataon main_table.CompID = select_data.CompIDand main_table.PortID = select_data.PortIDand main_table.PANLYID = select_data.PanlyIDand main_table.accountId = select_data.AccountIDand main_table.BcktID = select_data.bcktID |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-09-18 : 00:36:48
|
You're welcome |
 |
|
|
|
|
|
|
|