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 |
SergioM
Posting Yak Master
170 Posts |
Posted - 2013-08-06 : 17:43:36
|
I have a table in SQL server which has two rows. One has an ID of 'Bag CL55412'. Another has an ID of 'Bag CL55412-Cpy'. The Price for the first one is $99.99. I want to make the price for the second one 2% more & $.99 more.The data looks like thisID ChannelPrice CompanyIDBag CL55412 99.99 111Bag CL55412-Cpy 102.99 500 The SQL to select that formula looks like this.SELECT [ID] ,[ChannelPrice] ,(CEILING([ChannelPrice]*1.02)+.99) ,CompanyIDFROM [SC].[dbo].[Product]WHERE ID like '%CL55412%' To Update, I can think of something like this, but it will update based on itself, not a different row in the table. UPDATE [SC].[dbo].[Product] SET ChannelPrice=(CEILING([ChannelPrice]*1.02)+.99) How would I get it to update as I want it to? The origin CompanyID will always be 111 & the destination company ID will always be 500 for all of the respective rows that need to be updated-SergioI use Microsoft SQL 2008 |
|
tkizer
Almighty SQL Goddess
38200 Posts |
|
SergioM
Posting Yak Master
170 Posts |
Posted - 2013-08-06 : 17:51:13
|
Thanks Tara! I foolishly forgot to mention that it is not just for 1 row. That was only an example. This would need to update every row in that table.-SergioI use Microsoft SQL 2008 |
|
|
MuMu88
Aged Yak Warrior
549 Posts |
Posted - 2013-08-06 : 19:15:17
|
It is not clear what criteria you wanted to use to match the target and source rows when you have large data, here is an example of how to update a column value from one row from the same column from another row from the same table.[CODE]-- TEST DATA:DECLARE @Product TABLE(ID VARCHAR(20), ChannelPrice Numeric(12,2), CompanyID INT);INSERT INTO @Product VALUES('Bag CL55412', 99.99, 111),('Bag CL55412-Cpy', 102.99, 500),('Bag DL55412', 80, 111),('Bag DL55412-Cpy', 100, 500),('Bag EL55412', 90, 111),('Bag EL55412-Cpy', 105, 500);; WITH CTE AS(SELECT ROW_NUMBER() OVER(PARTITION BY LEFT(ID, 11) ORDER BY ID) AS RN, * FROM @Product)UPDATE PSET ChannelPrice=(SELECT (CEILING([ChannelPrice]*1.02)+.99) FROM CTE WHERE LEFT(ID, 11) = LEFT(P.ID, 11) and RN = 2)FROM @Product P INNER JOIN CTE T ON T.ID = P.ID and T.RN = 1;-- DATA BEFORE UPDATE:Bag CL55412 99.99 111Bag CL55412-Cpy 102.99 500Bag DL55412 80.00 111Bag DL55412-Cpy 100.00 500Bag EL55412 90.00 111Bag EL55412-Cpy 105.00 500-- DATA AFTER UPDATE:Bag CL55412 106.99 111Bag CL55412-Cpy 102.99 500Bag DL55412 102.99 111Bag DL55412-Cpy 100.00 500Bag EL55412 108.99 111Bag EL55412-Cpy 105.00 500[/CODE] |
|
|
|
|
|
|
|