【发布时间】:2014-07-17 09:08:07
【问题描述】:
我想创建一个 sql 查询,它将返回一个包含这些字段的视图:
s.ItemCode, s.ItemName, s.ItmsGrpCod, s.ItmsGrpNam, t.Name, t.FormulaResult_Cost
t.FormulaResult_Cost 将使用以下公式计算:
CASE WHEN IsNull(T3.U_VAR5, 0) = 0 THEN 0 ELSE ROUND(((T0.AvgPrice * T3.U_VAR1 * T3.U_VAR2) + T3.U_VAR3) * T3.U_VAR4 / IsNull(T3.U_VAR5, 0), 5) END AS FormulaResult_Cost
变量(U_VAR4、U_VAR5 等)位于名为dbo.[@Z_VARIABLES]的用户定义表中
我写的查询是:
SELECT TOP (100) PERCENT s.ItemCode, s.ItemName, s.ItmsGrpCod, s.ItmsGrpNam, t.Name, t.FormulaResult_Cost
FROM (SELECT DISTINCT T0.ItemCode, T0.ItemName, T0.ItmsGrpCod, T1.ItmsGrpNam
FROM dbo.OITM AS T0 INNER JOIN
dbo.OITB AS T1 ON T0.ItmsGrpCod = T1.ItmsGrpCod
WHERE (T0.QryGroup10 = 'Y')) AS s INNER JOIN
(SELECT T0.ItemCode, T3.Name, CASE WHEN IsNull(T3.U_VAR5, 0) = 0 THEN 0 ELSE ROUND(((T0.AvgPrice * T3.U_VAR1 * T3.U_VAR2) + T3.U_VAR3)
* T3.U_VAR4 / IsNull(T3.U_VAR5, 0), 5) END AS FormulaResult_Cost
FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN
dbo.OITM AS T0) AS t ON s.ItemCode = t.ItemCode
ORDER BY s.ItemCode
如果我对每个类别只有一个公式(t.Name:[@Z_VARIABLES] 的字段),则此查询非常有效。
现在我想为每个类别设置不同的公式。
所以,我试着用这段代码来做:
SELECT TOP (100) PERCENT s.ItemCode, s.ItemName, s.ItmsGrpCod, s.ItmsGrpNam, t.Name, t.FormulaResult_Cost
FROM (
(SELECT DISTINCT T0.ItemCode, T0.ItemName, T0.ItmsGrpCod, T1.ItmsGrpNam
FROM dbo.OITM AS T0 INNER JOIN
dbo.OITB AS T1 ON T0.ItmsGrpCod = T1.ItmsGrpCod
WHERE (T0.QryGroup10 = 'Y')) AS s INNER JOIN
(SELECT * FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0,
(CASE t3.Name
WHEN 'KOUZINES' THEN
SELECT T0.ItemCode, T3.Name, CASE WHEN IsNull(T3.U_VAR5, 0) = 0 THEN 0 ELSE ROUND(((T0.AvgPrice * T3.U_VAR1 * T3.U_VAR2) + T3.U_VAR3) * T3.U_VAR4 / IsNull(T3.U_VAR5, 0), 5) END AS FormulaResult_Cost
FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0
WHEN 'NYPTIRES' THEN
SELECT T0.ItemCode, T3.Name, '3.333' AS FormulaResult_Cost
FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0
WHEN 'PATOUDES & KAPPAKIA' THEN
SELECT T0.ItemCode, T3.Name, '4.444' AS FormulaResult_Cost
FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0
ELSE
SELECT T0.ItemCode, T3.Name, '11.11' AS FormulaResult_Cost
FROM dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0
END)
) AS t ON s.ItemCode = t.ItemCode
)
ORDER BY s.ItemCode
而且这个查询,有很多错误,比如:
消息 156,第 15 级,状态 1,第 9 行
关键字“CASE”附近的语法不正确。
消息 156,第 15 级,状态 1,第 15 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 18 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 21 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 24 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 27 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 30 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 33 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 36 行
关键字“WHEN”附近的语法不正确。
消息 156,第 15 级,状态 1,第 39 行
关键字“ELSE”附近的语法不正确。
消息 102,第 15 级,状态 1,第 42 行
')' 附近的语法不正确。
【问题讨论】:
-
是的,正如这个错误所说,你的代码中有几个
AS。喜欢这个AS T0 AS t。我认为您应该删除所有这些AS t -
@Darka ,在您解释错误后我编辑了我的代码...我更改了
AS。错误发生了变化,但我仍然对我必须做些什么来纠正我的代码感到困惑。是逻辑问题还是语法问题?请见上文 -
所有这种情况
CASE t3.Name都在错误的地方。您可以使用此CASE中的一个SELECT并将相同的CASE逻辑放在FormulaResult_Cost列上 -
但我已经有一个 select * from table 用于 case parameter , this case 。我只是不知道我写的这些是否正确。
标签: sql sql-server sql-view sapb1