使用同一个分类字段SQL相互执行两行
如果标题有点模糊,我很抱歉,我不知道该怎么说!本质上,在MS SQL Server 2008中,我尝试将一个值乘以另一个值,两个值具有相同的公共分类字段(但值不同)。这应该很容易,但我无法获得select语句的正确结构或语法。最好举一个例子:使用同一个分类字段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
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
您是否也可以添加预期的输出数据?