使用同一个分类字段SQL相互执行两行

使用同一个分类字段SQL相互执行两行,sql,sql-server,Sql,Sql Server,如果标题有点模糊,我很抱歉,我不知道该怎么说!本质上,在MS SQL Server 2008中,我尝试将一个值乘以另一个值,两个值具有相同的公共分类字段(但值不同)。这应该很容易,但我无法获得select语句的正确结构或语法。最好举一个例子: TableA Year | Quarter | Name | Parameter | Month1 | Month2 | ...Month12 2015 | Mar | Jones | A | 123.45 | 6

如果标题有点模糊,我很抱歉,我不知道该怎么说!本质上,在MS SQL Server 2008中,我尝试将一个值乘以另一个值,两个值具有相同的公共分类字段(但值不同)。这应该很容易,但我无法获得select语句的正确结构或语法。最好举一个例子:

TableA
Year | Quarter | Name   | Parameter | Month1   | Month2  | ...Month12
2015 | Mar     | Jones  |    A      |   123.45 |  678.99 | ..
2015 | Mar     | Jones  |    B      |   33.45  |  444.99 | ..
2015 | Mar     | Jones  |    C      |   0.22   |  0.21   | ..
2015 | Mar     | Jones  |    D      |   0.01   |  0.05   | ..
2015 | Mar     | Smith  |    A      |   555.11 |  333.22 | ..
2015 | Mar     | Smith  |    B      |   222.11 |  101.31 | ..
2015 | Mar     | Smith  |    C      |   0.02   |  0.08   | ..
2015 | Mar     | Smith  |    D      |   0.09   |  0.21   | ..
在临时表TableA中,我尝试将参数a的Month1乘以每个名称的参数C的Month1,并将这个新值放在TableB的新Month1字段中

TableB将具有与TableA相同的字段,但参数字段将包含新的/不同的项(例如X、Y…,因为它现在是一个计算字段)。我也会为2月,3月做同样的事情。。等12个月。在编写select查询时,我不知道是使用where子句为每个参数值在select语句中放置子查询,还是将子查询放置在“from”列表中。。。两个都不适合我

非常感谢您的帮助!
谢谢

希望这是你想要的东西,但我必须承认,这闻起来像是结构重新设计

只需将其粘贴到一个空的查询窗口中并执行即可。适应你的需要

DECLARE @tblA TABLE (Year INT, Quarter VARCHAR(3), Name VARCHAR(10),Parameter VARCHAR(1),Month1 DECIMAL(6,2), Month2 DECIMAL(6,2) /*further months*/);
INSERT INTO @tblA VALUES
 (2015,'Mar','Jones','A',123.45,678.99)
,(2015,'Mar','Jones','B',33.45,444.99)
,(2015,'Mar','Jones','C',0.22,0.21)
,(2015,'Mar','Jones','D',0.01,0.05)
,(2015,'Mar','Smith','A',555.11,333.22)
,(2015,'Mar','Smith','B',222.11,101.31)
,(2015,'Mar','Smith','C',0.02,0.08)
,(2015,'Mar','Smith','D',0.09,0.21)

SELECT * FROM @tblA;

DECLARE @tblB TABLE (Year INT, Quarter VARCHAR(3), Name VARCHAR(10),Parameter VARCHAR(1),Month1 DECIMAL(6,2), Month2 DECIMAL(6,2)/*further months*/);

WITH RowsWithA AS
(
    SELECT * FROM @tblA WHERE Parameter='A'
)
INSERT INTO @tblB
SELECT Year,Quarter,Name,'x',MonthsCalculated.*
FROM RowsWithA
CROSS APPLY
(
    SELECT RowsWithA.Month1 * (  SELECT x.Month1 
                                 FROM @tblA AS x 
                                 WHERE x.Year =RowsWithA.Year 
                                   AND x.Quarter=RowsWithA.Quarter 
                                   AND x.Name=RowsWithA.Name
                                   AND x.Parameter='C'
                              ) AS Month1
          ,RowsWithA.Month2 * (  SELECT x.Month2 
                                 FROM @tblA AS x 
                                 WHERE x.Year =RowsWithA.Year 
                                   AND x.Quarter=RowsWithA.Quarter 
                                   AND x.Name=RowsWithA.Name
                                   AND x.Parameter='C'
                              ) AS Month2
          /*further months*/
) AS MonthsCalculated;

SELECT * FROM @tblB

您是否也可以添加预期的输出数据?