Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用带有SQL游标的case语句对每行执行计算并对结果求和_Sql Server - Fatal编程技术网

Sql server 使用带有SQL游标的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

我使用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 * 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