Sql server 使用带有SQL游标的case语句对每行执行计算并对结果求和
我使用case语句和游标对每一行执行计算,然后显示结果的总和 我有一张这样的桌子:Sql server 使用带有SQL游标的case语句对每行执行计算并对结果求和,sql-server,Sql Server,我使用case语句和游标对每一行执行计算,然后显示结果的总和 我有一张这样的桌子: ID Name Amount Income_Frequency 123 Sam 500 Bi-weekly 123 Ralf 200 Weekly 123 Floyd 10000 Annual 我需要对每行执行如下计算: SELECT CASE WHEN Income_Frequency = 'Weekly' THEN Amount * 5
ID Name Amount Income_Frequency
123 Sam 500 Bi-weekly
123 Ralf 200 Weekly
123 Floyd 10000 Annual
我需要对每行执行如下计算:
SELECT
CASE
WHEN Income_Frequency = 'Weekly' THEN Amount * 52
WHEN Income_Frequency = 'Bi-weekly' THEN Amount * 26
WHEN Income_Frequency = 'Monthly' THEN Amount * 12
WHEN Income_Frequency = 'Annual' THEN Amount * 1
ELSE '0'
END
山姆的总收入应该是13000,拉尔夫10400,弗洛伊德10000。然后我需要将这3个金额相加,得到33400
以下是我尝试过但不起作用的方法:
DECLARE @Total decimal(9,2)
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
(SELECT TOP(1)
CASE
WHEN Income_Frequency = 'Weekly' THEN Amount * 52
WHEN Income_Frequency = 'Bi-weekly' THEN Amount * 26
WHEN Income_Frequency = 'Monthly' THEN Amount * 12
WHEN Income_Frequency = 'Annual' THEN Amount * 1
ELSE '0'
END as AnnualIncome
FROM MyTable where ID = 123)
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO @Total
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MY_CURSOR INTO @Total
SELECT SUM(@Total)
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
只是想进一步阐述一下史蒂夫的评论 示例或 结果
Annual
33400
试试这个:
MS SQL Server 2017架构设置:
CREATE TABLE MyTable
(
ID INT,
Name VARCHAR(20),
Amount Decimal(9,2),
Income_Frequency VARCHAR(20)
)
INSERT INTO MyTable
VALUES
(123, 'Sam',500, 'Bi-weekly'),
(123, 'Ralf',200, 'Weekly'),
(123, 'Floyd',10000, 'Annual')
DECLARE @Total decimal(9,2)
SELECT @Total= SUM(
CASE
WHEN Income_Frequency = 'Weekly' THEN Amount * 52
WHEN Income_Frequency = 'Bi-weekly' THEN Amount * 26
WHEN Income_Frequency = 'Monthly' THEN Amount * 12
WHEN Income_Frequency = 'Annual' THEN Amount * 1
ELSE 0
END)
FROM MyTable
where ID = 123
SELECT @Total
| |
|-------|
| 33400 |
查询1:
CREATE TABLE MyTable
(
ID INT,
Name VARCHAR(20),
Amount Decimal(9,2),
Income_Frequency VARCHAR(20)
)
INSERT INTO MyTable
VALUES
(123, 'Sam',500, 'Bi-weekly'),
(123, 'Ralf',200, 'Weekly'),
(123, 'Floyd',10000, 'Annual')
DECLARE @Total decimal(9,2)
SELECT @Total= SUM(
CASE
WHEN Income_Frequency = 'Weekly' THEN Amount * 52
WHEN Income_Frequency = 'Bi-weekly' THEN Amount * 26
WHEN Income_Frequency = 'Monthly' THEN Amount * 12
WHEN Income_Frequency = 'Annual' THEN Amount * 1
ELSE 0
END)
FROM MyTable
where ID = 123
SELECT @Total
| |
|-------|
| 33400 |
:
CREATE TABLE MyTable
(
ID INT,
Name VARCHAR(20),
Amount Decimal(9,2),
Income_Frequency VARCHAR(20)
)
INSERT INTO MyTable
VALUES
(123, 'Sam',500, 'Bi-weekly'),
(123, 'Ralf',200, 'Weekly'),
(123, 'Floyd',10000, 'Annual')
DECLARE @Total decimal(9,2)
SELECT @Total= SUM(
CASE
WHEN Income_Frequency = 'Weekly' THEN Amount * 52
WHEN Income_Frequency = 'Bi-weekly' THEN Amount * 26
WHEN Income_Frequency = 'Monthly' THEN Amount * 12
WHEN Income_Frequency = 'Annual' THEN Amount * 1
ELSE 0
END)
FROM MyTable
where ID = 123
SELECT @Total
| |
|-------|
| 33400 |
为什么要使用游标,一个简单的查询和一个大小写就可以了fine@SteveFord我试过了,但总共得到了10000个。谢谢。只是要补充一点,很少有情况下你需要使用光标。尽量避免它们,因为它们没有表现出来,而且更难理解。SQL是一种基于集合的语言,应该以这种方式使用,而不是使用迭代。请注意,
CASE
可以写得稍微优雅一些(IMO),因为当“每周”时,CASE-Income\u频率为52…
ELSE可以完全省略,而不会影响结果(但如果它仍然存在,它应该是0
,而不是'0'
)。只需在Steve的评论上展开展开即可。由于数学与当前行的值直接相关(简单数学)-SQL Server将能够执行“基于集合的操作”它将比游标更快、效率更高。如果您在游标循环中进行求和或平均值运算,则可能是做错了。@SqlSurfer您是对的。更多单词…更好:)跳过了@Total+1