| Author |
Topic |
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-07 : 05:55:22
|
| I have a following tables :ID------Name -------Salary1---------A----------1002---------B----------50003---------C----------90004---------D----------40005---------E----------6000.......1000 ----X----------4000I offer average salary about 5000$ How can i find person which have nearest salarys with average salaryExpected output 1:4--------D-------4000$1000----X-------4000$Expected output 2:5--------E---------6000$Thank you very much. |
|
|
Sachin.Nand
2937 Posts |
Posted - 2010-03-07 : 06:55:53
|
| Do u want salary to be +- 1000 of the average salary?PBUH |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2010-03-07 : 07:04:06
|
[code]SELECT TOP(1) WITH TIES s.*FROM Table1 AS sCROSS JOIN ( SELECT AVG(Salary) AS Salary FROM Table1 ) AS wORDER BY ABS(w.Salary - w.Salary)[/code] N 56°04'39.26"E 12°55'05.63" |
 |
|
|
webfred
Master Smack Fu Yak Hacker
8781 Posts |
Posted - 2010-03-07 : 07:15:29
|
w.Salary - w.SalaryIs that correct? No, you're never too old to Yak'n'Roll if you're too young to die. |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2010-03-07 : 08:25:45
|
quote: Originally posted by webfred w.Salary - w.SalaryIs that correct? No, you're never too old to Yak'n'Roll if you're too young to die.
Nope it should be w.Salary - s.Salary------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
ms65g
Constraint Violating Yak Guru
497 Posts |
Posted - 2010-03-07 : 16:47:47
|
| [code]declare @t table(ID int IDENTITY(1,1), Name char(1), Salary int); INSERT @t VALUES('A',100),('B',5000),('C',9000),('D',4000),('E',6000),('X',4000);--Expected output 0SELECT ID, Name, Salary FROM (SELECT *,DENSE_RANK() OVER(ORDER BY Rank_ID) AS [Rank] FROM (SELECT *, Rank_ID = ABS(AVG(Salary) OVER() - Salary) FROM @t) D) D1 WHERE [Rank] = 1;/*ID Name Salary----------- ---- -----------2 B 5000*/--Expected output 1SELECT ID, Name, Salary FROM (SELECT *,DENSE_RANK() OVER(ORDER BY Rank_ID) AS [Rank] FROM (SELECT *, Rank_ID = ABS(AVG(Salary) OVER() - Salary) FROM @t) D) D1WHERE [Rank] = 2;/*ID Name Salary----------- ---- -----------4 D 40006 X 4000*/--Expected output 2SELECT ID, Name, Salary FROM (SELECT *,DENSE_RANK() OVER(ORDER BY Rank_ID) AS [Rank] FROM (SELECT *, Rank_ID = ABS(AVG(Salary) OVER() - Salary) FROM @t) D) D1 WHERE [Rank] = 3;/*ID Name Salary----------- ---- -----------5 E 6000*/[/code] |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-07 : 22:53:03
|
quote: Originally posted by pamyral_279 I have a following tables :ID------Name -------Salary1---------A----------1002---------B----------50003---------C----------90004---------D----------40005---------E----------6000.......1000 ----X----------4000I offer average salary about 5000$ How can i find person which have nearest salarys with average salaryExpected output 1:4--------D-------4000$1000----X-------4000$Expected output 2:5--------E---------6000$Thank you very much.
I'm sorry for not explain clearly !My idea is if i offer salary 5000$I will get name who is D,X4--------D-------4000$1000----X-------4000$5--------E---------6000$if i offer salary 300$i will get name who is A1---------A----------100I will select all records which near salary which i offer !offer salary can be changed which i wish ! Thank you very much. |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-03-07 : 23:27:42
|
[code]declare @OfferSalary intselect @OfferSalary= 5000SELECT ID, Name, SalaryFROM ( SELECT *, row_no = DENSE_RANK() OVER(ORDER BY abs(Salary - @OfferSalary)) FROM yourtable where Salary <> @OfferSalary) s WHERE row_no = 1[/code] KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-08 : 02:14:15
|
quote: Originally posted by khtan
declare @OfferSalary intselect @OfferSalary= 5000SELECT ID, Name, SalaryFROM ( SELECT *, row_no = DENSE_RANK() OVER(ORDER BY abs(Salary - @OfferSalary)) FROM yourtable where Salary <> @OfferSalary) s WHERE row_no = 1 KH[spoiler]Time is always against us[/spoiler]
Sorry may be my bad explain ! my input :ID----Name---Salary1------ A------ 32------ B------ 63------ C------ 94------ D------ 125------ E------ 156------ F------ 187------ G------ 218------ H------ 239------ K------ 9If offersalary is 10 i need output :ID-----Name---Salary3------C--------99------K--------94------D--------12If offersalary is 18 i need output :ID-----Name---Salary1------F--------18Because offer salary match exactly data in table.If offersalary is 2 i need output :ID-----Name---Salary1------A--------3It's only one record because no lower bound ! one higher bound is 3.Thank you very much. |
 |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-03-08 : 03:23:04
|
You can make use of ms65g's query like thisdeclare @OfferSalary intselect @OfferSalary= 10IF exists(select * from @t where Salary=@OfferSalary) SELECT ID,Name,Salary FROM @t WHERE Salary=@OfferSalaryelse SELECT ID, Name, SalaryFROM (SELECT *,DENSE_RANK() OVER(ORDER BY abs(Salary - @OfferSalary)) AS [Rank] FROM (SELECT *, Rank_ID = ABS(AVG(Salary) OVER() - Salary) FROM @t) D) D1 WHERE [Rank] <= 2 MadhivananFailing to plan is Planning to fail |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-03-08 : 03:52:12
|
[code]declare @OfferSalary intselect @OfferSalary= 5000SELECT ID, Name, SalaryFROM ( SELECT *, row_no = DENSE_RANK() OVER(ORDER BY abs(Salary - @OfferSalary)) FROM yourtable WHERE Salary <> @OfferSalary) s WHERE row_no = 1[/code] KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2010-03-08 : 09:37:18
|
| [code]SELECT TOP 1 WITH TIES ID, Name, SalaryFROM YourTableORDER BY ABS(Salary-@InputValue) ASC[/code]------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2010-03-08 : 09:53:20
|
quote: Originally posted by visakh16
SELECT TOP 1 WITH TIES ID, Name, SalaryFROM YourTableORDER BY ABS(Salary-@InputValue) ASC ------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
If there is no direct match OP needs nearest minimum as well as maximumMadhivananFailing to plan is Planning to fail |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2010-03-08 : 11:41:25
|
quote: Originally posted by madhivanan
quote: Originally posted by visakh16
SELECT TOP 1 WITH TIES ID, Name, SalaryFROM YourTableORDER BY ABS(Salary-@InputValue) ASC ------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
If there is no direct match OP needs nearest minimum as well as maximumMadhivananFailing to plan is Planning to fail
Oops missed that ------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-08 : 11:48:36
|
quote: Originally posted by khtan
declare @OfferSalary intselect @OfferSalary= 5000SELECT ID, Name, SalaryFROM ( SELECT *, row_no = DENSE_RANK() OVER(ORDER BY abs(Salary - @OfferSalary)) FROM yourtable WHERE Salary <> @OfferSalary) s WHERE row_no = 1 KH[spoiler]Time is always against us[/spoiler]
The first thing i want to say to thank madhivanan,visakh16 and khtan very much.Khtan's statement is perfect in my problem.I want to ask more,example i want to select top 5 nearest as your guide ? how can i do ?I need to 2 statements runs individual :Input :1 A 33 C 74 D 75 E 126 F 177 G 188 H 189 K 9First statement get lower bound - offer salary is 10Expect output1 (top 5)9 K 93 C 74 D 71 A 3Second statement get higher bound - offer salary is 10Expect output2 (top 5)5 E 126 F 177 G 188 H 18Can you help me ! thanks again |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2010-03-08 : 11:54:57
|
| you tell top 5 but you're showing only 4 values, why is that?------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-08 : 11:58:32
|
quote: Originally posted by visakh16 you tell top 5 but you're showing only 4 values, why is that?------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
If my data is only 4 records which suitable ! i will show that records,if in my data is enough 5 records, i will show 5 records. |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2010-03-08 : 12:09:58
|
| [code]SELECT ID, Name, SalaryFROM(SELECT ID, Name, Salary,CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 'E' ELSE 'U' END AS CAt,ROW_NUMBER() OVER(PARTITION BY CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 'E' ELSE 'U' END ORDER BY abs(Salary - @OfferSalary)) AS Seq)tWHERE Seq < = @NAND Cat=@Cat[/code]now pass @Cat as L or E or U for lower, equal or upper bound results respectivelyand pass a value for @N to get desired number of results like 5,3,...------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-08 : 21:14:51
|
quote: Originally posted by visakh16
SELECT ID, Name, SalaryFROM(SELECT ID, Name, Salary,CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 'E' ELSE 'U' END AS CAt,ROW_NUMBER() OVER(PARTITION BY CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 'E' ELSE 'U' END ORDER BY abs(Salary - @OfferSalary)) AS Seq)tWHERE Seq < = @NAND Cat=@Cat now pass @Cat as L or E or U for lower, equal or upper bound results respectivelyand pass a value for @N to get desired number of results like 5,3,...------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/
Sorry your statement is wrong !i get Incorrect syntax near 'E' when run your statement.Can you edit ? |
 |
|
|
khtan
In (Som, Ni, Yak)
17689 Posts |
Posted - 2010-03-08 : 21:56:54
|
just a missing THENSELECT ID, Name, SalaryFROM(SELECT ID, Name, Salary,CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 THEN'E' ELSE 'U' END AS CAt,ROW_NUMBER() OVER(PARTITION BY CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 THEN 'E' ELSE 'U' END ORDER BY abs(Salary - @OfferSalary)) AS Seq)tWHERE Seq < = @NAND Cat=@Cat KH[spoiler]Time is always against us[/spoiler] |
 |
|
|
pamyral_279
Posting Yak Master
143 Posts |
Posted - 2010-03-08 : 23:36:57
|
quote: Originally posted by khtan just a missing THENSELECT ID, Name, SalaryFROM(SELECT ID, Name, Salary,CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 THEN'E' ELSE 'U' END AS CAt,ROW_NUMBER() OVER(PARTITION BY CASE WHEN Salary - @OfferSalary< 0 THEN 'L' WHEN Salary - @OfferSalary= 0 THEN 'E' ELSE 'U' END ORDER BY abs(Salary - @OfferSalary)) AS Seq)tWHERE Seq < = @NAND Cat=@Cat KH[spoiler]Time is always against us[/spoiler]
I don't find where to insert my table !! |
 |
|
|
Next Page
|