【问题标题】:Errors within SQL-View with INNER JOINS and CASES带有 INNER JOINS 和 CASES 的 SQL-View 中的错误
【发布时间】: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_VAR4U_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 parameterthis case 。我只是不知道我写的这些是否正确。

标签: sql sql-server sql-view sapb1


【解决方案1】:

我的意思是你可以更简单地重写它:

  (SELECT * FROM dbo.[@Z_VARIABLES] AS T3 
    CROSS JOIN dbo.OITM AS T0
    INNER JOIN (
                SELECT T0.ItemCode, T3.Name
                , CASE t3.Name
                     WHEN 'KOUZINES' THEN     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
                     WHEN 'NYPTIRES' THEN '3.333' 
                     WHEN 'PATOUDES & KAPPAKIA' THEN '4.444'
                     ELSE '11.11'
                  END AS FormulaResult_Cost
                FROM   dbo.[@Z_VARIABLES] AS T3 CROSS JOIN dbo.OITM AS T0
                )

这未经测试。能找到一些bug。 而且我不知道你所有的逻辑,但对我来说看起来很多CROSS JOINS,但就像我说的,不知道逻辑。

【讨论】:

  • 我做了我想做的事。非常感谢您。我没办法把它简化这么多。
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2012-01-09
相关资源
最近更新 更多