我对SQL很陌生,仍然试图了解一些概念...... 我创建了一个简单的表,我试图使用CASE语句更新表中的一个列。我理解为什么这个法规不会起作用,但我对如何解决它感到困惑....
这是我的代码:
CREATE TABLE q5
(
UserID INT,
Month INT,
Score INT
)
INSERT INTO q5(UserID, Month, Score)
VALUES (1,1,10), (1,2,5), (1,1,6), (2,8,6), (3,1,9), (3,4,11), (3,6,9), (4,9,10), (5,1,2);
UPDATE q5
SET
Month = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
ELSE 'Fourth Quarter'
END
我收到此错误:
Msg 245,Level 16,State 1,Line 1 转换varchar值时,转换失败'第一季度'数据类型int。
答案 0 :(得分:1)
月定义为int,但您尝试更新表并将Month设置为varchar,如“First Quarter”。您可以更改Month以存储varchar,然后修改insert语句和WHEN Month IN部分,或者添加可以存储该季度的其他列。
下面的查询显示了第二个选项(添加了一个附加列)。
CREATE TABLE q5
(
UserID INT,
Month INT,
Score INT,
Quarter varchar(20)
)
INSERT INTO q5(UserID, Month, Score)
VALUES (1,1,10), (1,2,5), (1,1,6), (2,8,6), (3,1,9), (3,4,11), (3,6,9), (4,9,10), (5,1,2);
UPDATE q5
SET
Quarter = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
ELSE 'Fourth Quarter'
END
根据如何使用它,您最好添加一个可以计算季度的视图。这样,您就不必维护额外的列,这完全取决于Month列。
答案 1 :(得分:0)
您的列MONTH
只能存储INT
类型的数据。您现在获得的内容类似于以下程序代码:
int month = 2;
if (month == 1 || month == 2 || month == 3)
{
month = "First Quarter"; // compiler error
}
正如您所看到的那样,条件执行的行是相当荒谬的,因为月份的类型为int
。
您可能希望添加其他列,例如Quarter
。
ALTER TABLE q5 ADD Quarter NVARCHAR(100)
UPDATE q5
SET
Quarter = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
ELSE 'Fourth Quarter'
END
尽管实际上,列出值名称应该由UI完成。最佳做法是使用计算列或具有VIEW
列的单独Quarter INT
。此代码将添加具有适当数据类型的计算列。
ALTER TABLE q5 ADD
Quarter AS CASE WHEN Month IN (1, 2, 3) THEN 1
WHEN Month IN (4, 5, 6) THEN 2
WHEN Month IN (7, 8, 9) THEN 3
ELSE 4
END