sql-server - Msg 1949 和 Msg 8668,当我创建索引视图时
问题描述
我想创建以下视图:
CREATE VIEW vPRODUCT
WITH SCHEMABINDING
AS
SELECT
PROD_ID AS PRODUCT_ID,
YEAR(TIME_ID) AS YEAR,
MONTH(TIME_ID) AS MONTH,
DATEPART(WEEK, TIME_ID) AS WEEK,
SUM(AMOUNT_SOLD) AS TOTAL_AMOUNT_SOLD,
SUM(QUANTITY_SOLD) AS TOTAL_QUANTITY_SOLD,
ROUND(SUM(AMOUNT_SOLD)/SUM(QUANTITY_SOLD),2) AS AVERAGE_SALE_PRICE,
COUNT_BIG(*) AS COUNT
FROM
dbo.SALES
GROUP BY
PROD_ID, YEAR(TIME_ID), MONTH(TIME_ID), DATEPART(WEEK, TIME_ID);
然后创建索引视图:
CREATE UNIQUE CLUSTERED INDEX IDX_V
ON vPRODUCT (PRODUCT_ID, YEAR, MONTH);
这将返回消息:
消息 1949,级别 16,状态 1,第 15 行
无法在视图“dbo.vPRODUCT”上创建索引。函数“datepart”产生不确定的结果。使用确定性系统函数,或修改用户定义函数以返回确定性结果。
因此,我尝试创建以下视图(没有 WEEK):
CREATE VIEW vPRODUCT
WITH SCHEMABINDING
AS
SELECT
PROD_ID AS PRODUCT_ID,
YEAR(TIME_ID) AS YEAR,
MONTH(TIME_ID) AS MONTH,
SUM(AMOUNT_SOLD) AS TOTAL_AMOUNT_SOLD,
SUM(QUANTITY_SOLD) AS TOTAL_QUANTITY_SOLD,
ROUND(SUM(AMOUNT_SOLD)/SUM(QUANTITY_SOLD),2) AS AVERAGE_SALE_PRICE,
COUNT_BIG(*) AS COUNT
FROM
dbo.SALES
GROUP BY
PROD_ID, YEAR(TIME_ID), MONTH(TIME_ID);
然后创建索引视图:
CREATE UNIQUE CLUSTERED INDEX IDX_V
ON vPRODUCT (PRODUCT_ID, YEAR, MONTH);
然后我收到这条消息:
消息 8668,级别 16,状态 0,第 14 行
无法在视图“dbo.vPRODUCT”上创建聚集索引“IDX_V”,因为视图的选择列表包含聚合函数或分组列的结果表达式。考虑从选择列表中删除聚合函数或分组列的结果表达式。
有没有人可以指出查询有什么问题?
解决方案
推荐阅读
- c# - 动态对象不包含来自引用的属性定义
- vue.js - 在 webcomponent 构建中使用插槽时,VueJS $children 为空
- node.js - 为什么在 Node.js 中使用猫鼬模式
- python - 按行中的值从熊猫数据透视表中过滤
- machine-learning - 尝试调用函数时 Octave 中的错误:第 1 行第 1 列附近未定义
- node.js - Mongoose 全文搜索未正确过滤
- php - 将域从 DO 帐户 droplet 移动到另一个 DO 帐户 droplet
- .net-core - 在 Blazor 中筛选分页列表
- wpf - 从 ClipboardWatcher 绑定数据
- google-cloud-platform - Google Cloud Platform - Dataflow 不使用 KMS 密钥解密数据