0

我想创建一个 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 行
')' 附近的语法不正确。

4

1 回答 1

0

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

  (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,但就像我说的,不知道逻辑。

于 2014-07-17T09:49:35.877 回答