【问题标题】:Trouble calculating difference of results from nested sub queries and getting a syntax error无法计算嵌套子查询的结果差异并出现语法错误
【发布时间】:2020-09-10 17:08:01
【问题描述】:

如果我单独运行每个查询,我会得到结果,但是,当我尝试执行嵌套查询时,我会继续遇到语法错误。

消息 102,第 15 级,状态 1,第 10 行
')' 附近的语法不正确。

这是我正在尝试运行的查询的副本。

Select 
    P.Part_Type, P.Number, P.mold, 
    dbo.tbl_Msmt_Data.Result as Val1, 
    dbo.tbl_Msmt_Data.Result as Val2, 
    ((Val1 - Val2) / 60) As DIFF
From 
    (Select 
         P.Part_Type, P.Number, P.mold, dbo.tbl_Msmt_Data.Result as Val1
     from
         dbo.tbl_Parts P 
     inner join
         dbo.tbl_Msmt_Data on P.Parts_ID = dbo.tbl_Msmt_Data.Part
     where 
         (P.Part_Type = 'Shell PS') 
         and (dbo.tbl_Msmt_Data.Msmt_Spec = 7327)

     union all

     select 
         P.Part_Type, P.Number, P.mold, dbo.tbl_Msmt_Data.Result as Val2
     from
         dbo.tbl_Parts P 
     inner join
         dbo.tbl_Msmt_Data on P.Parts_ID = dbo.tbl_Msmt_Data.Part
     where 
         (P.Part_Type = 'Shell PS') 
         and (dbo.tbl_Msmt_Data.Msmt_Spec = 7326)
)

我已尝试删除零件表的别名。我尝试在第二个查询中只选择 Val2。在这一点上,我不确定我还能做什么。

这是 Val1 的结果示例

这是来自 tbl_parts 和 tbl_msmt_data 的数据样本

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。编写此查询可能有更简单的方法。 . .如果很清楚你想做什么。
  • 你需要给你的派生表起别名FROM ( SELECT... ) AS MyTable

标签: sql sql-server database tsql


【解决方案1】:

试试这个:

SELECT 
    Part_Type, 
    Number, 
    mold, 
    Val1, 
    Val2, 
    ( ( Val1 - Val2 ) / 60 ) AS DIFF -- possible divide by zero exception!
FROM (

    SELECT 
        P.Part_Type, P.Number, P.mold, ISNULL ( M.Result, 0 ) AS Val1, 0 AS Val2
    FROM dbo.tbl_Parts AS P 
    INNER JOIN dbo.tbl_Msmt_Data AS M
        ON P.Parts_ID = M.Part
    WHERE 
        P.Part_Type = 'Shell PS' 
        AND M.Msmt_Spec = 7327
    UNION ALL
    SELECT 
        P.Part_Type, P.Number, P.mold, 0 AS Val1, ISNULL ( M.Result, 0 ) AS Val2
    FROM dbo.tbl_Parts AS P 
    INNER JOIN dbo.tbl_Msmt_Data AS M
        ON P.Parts_ID = M.Part
    WHERE 
        P.Part_Type = 'Shell PS'
        AND M.Msmt_Spec = 7326

) AS MyTable;

更新:

我不得不将答案标记为未解决,因为我发现了我之前没有看到的解决方案的问题。当它进行查询时,它将为每个数字显示两个条目,一行将 Val 1 为空,而 Val 2 有一个数字。

要为 Msmt_Spec 值 7326 和 7327 返回单行,您可以执行以下操作:

SELECT 
    Part_Type, 
    Number, 
    Mold, 
    Val1, 
    Val2, 
    ( ( Val1 - Val2 ) / 60 ) AS DIFF
FROM (

    SELECT
        P.Part_Type, P.Number, P.Mold
        , MAX ( CASE WHEN M.Msmt_Spec = 7327 THEN M.Result ELSE 0 END ) AS Val1
        , MAX ( CASE WHEN M.Msmt_Spec = 7326 THEN M.Result ELSE 0 END ) AS Val2
    FROM dbo.tbl_Parts AS P
    INNER JOIN dbo.tbl_Msmt_Data AS M
        ON P.Parts_ID = M.Part
    WHERE 
        P.Part_Type = 'Shell PS'
        AND M.Msmt_Spec IN ( 7326, 7327 )
    GROUP BY
        Part_Type, Number, Mold

) AS MyTable
ORDER BY
    Part_Type, Number;

我的测试结果(有限的数据集)返回如下:

+-----------+--------+------+------+------+------+
| Part_Type | Number | Mold | Val1 | Val2 | DIFF |
+-----------+--------+------+------+------+------+
| Shell PS  |   2200 |    2 | 1000 |  847 |    2 |
| Shell PS  |   2201 |    3 | 1608 | 1500 |    1 |
| Shell PS  |   2202 |    1 |  225 |   45 |    3 |
| Shell PS  |   2203 |    4 | 1015 |  909 |    1 |
| Shell PS  |   2204 |    2 | 1615 | 1447 |    2 |
+-----------+--------+------+------+------+------+

这是您想要实现的目标吗?

【讨论】:

  • 我试过了,但收到以下错误消息 4104,级别 16,状态 1,行 2 无法绑定多部分标识符“P.Part_Type”。消息 4104,级别 16,状态 1,行 3 无法绑定多部分标识符“P.Number”。消息 4104,级别 16,状态 1,行 4 无法绑定多部分标识符“P.mold”。 Msg 4104, Level 16, State 1, Line 5 无法绑定多部分标识符“dbo.tbl_Msmt_Data.Result”。无法绑定多部分标识符“dbo.tbl_Msmt_Data.Result”。
  • 无法绑定多部分标识符“dbo.tbl_Msmt_Data.Result”。消息 4104,级别 16,状态 1,第 6 行无法绑定多部分标识符“dbo.tbl_Msmt_Data.Result”。消息 207,级别 16,状态 1,第 7 行无效的列名称“Val2”。
  • 我有一个错字。试试我更新的答案。哦,Val2 错误是有道理的,因为您的联合的第一个 SELECT 将列别名为 Va1。让我看看这个。
  • 仍然报错:Msg 4104, Level 16, State 1, Line 2 无法绑定多部分标识符“P.Part_Type”。消息 4104,级别 16,状态 1,行 3 无法绑定多部分标识符“P.Number”。消息 4104,级别 16,状态 1,行 4 无法绑定多部分标识符“P.mold”。消息 207,级别 16,状态 1,第 6 行无效的列名称“Val2”。消息 207,级别 16,状态 1,第 7 行无效的列名称“Val2”。
  • 你能分享一些来自 tbl_Parts 和 tbl_Msmt_Data 的数据吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多