乘以最大行并附加到列表

时间:2017-08-01 20:48:44

标签: sql-server

我在两个表中有以下内容:

(SFR_MAIN)

SQ. FT. AREA     1         2
400          86.6600    86.7300
500          82.3300    82.4000
600          78.9600    79.0200
700          76.2100    76.2700
800          73.9100    73.9700
900          71.9400    71.9900
1000         70.2200    70.2700
1100         68.7000    68.7500
1200         67.3400    67.3900
1300         66.1200    66.1600
1400         65.0000    65.0400
1600         63.0400    63.0800
1800         61.3600    61.3900
2000         59.8900    59.9300
2200         58.6000    58.6300
2400         57.4400    57.4700
2600         56.3900    56.4200
2800         55.4400    55.4700
3000         54.5700    54.6000

(MULT)

SQ. FT. AREA    MULTIPLIER
3100            0.992
3200            0.986
3300            0.978
3400            0.971
3500            0.964
3600            0.958
3700            0.952
3800            0.946
4000            0.934

这个想法是用两者创建一个表。问题是第二个乘数应该乘以第一个最大(最大)平方英尺。

因此列.992 * 54.57的{​​{1}}和列1的{​​{1}}为3100,是的,这些是列的实际名称。

所以期望的输出是:

.992 * 54.6

我可以这样做一列:

2

如果我只有两列我会做两次,但我有16列 。有没有办法迭代列来将它们并排放在一个表中?

我正在使用SQL Server 2012

2 个答案:

答案 0 :(得分:3)

示例

Select * From SFR_MAIN
Union All
Select B.[SQ. FT. AREA]
      ,[1] = A.[1]*B.MULTIPLIER
      ,[2] = A.[2]*B.MULTIPLIER
 From (Select Top 1 with ties * from SFR_MAIN Order by [SQ. FT. AREA] Desc) A
 Join MULT B on B.[SQ. FT. AREA]>A.[SQ. FT. AREA]

<强>返回

enter image description here

答案 1 :(得分:2)

数据库中的迭代通常是个坏主意。数据库在基于集合的方法上更好地工作。所以,如你所描述的那样结合,然后在第一组中具有最高平方英尺的记录上使用交叉连接,然后进行数学运算。

SELECT [SQ. Ft. Area], [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16] 
FROM sfr_Main 
UNION ALL

SELECT A.[SQ. FT. Area]
     , B.multiplier*[1] as 1
     , B.multiplier*[2] as 2
     , B.multiplier*[3] as 3
     , B.multiplier*[4] as 4
     , B.multiplier*[5] as 5
     , B.multiplier*[6] as 6
     , B.multiplier*[7] as 7
     , B.multiplier*[8] as 8
     , B.multiplier*[9] as 9
     , B.multiplier*[10] as 10
     , B.multiplier*[11] as 11
     , B.multiplier*[12] as 12
     , B.multiplier*[13] as 13
     , B.multiplier*[14] as 14
     , B.multiplier*[15] as 15
     , B.multiplier*[16] as 16

FROM MULT A
CROSS JOIN (SELECT top 1 [SQ. Ft. Area], [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]
            FROM sfr_main 
            ORDER BY [sq.ft.area] desc) B