【问题标题】:SQL - A summary table, how to fix the error of “The multi-part identifier "…" could not be bound.”SQL - 一个汇总表,如何解决“无法绑定多部分标识符”的错误。”
【发布时间】:2018-09-13 14:50:50
【问题描述】:

我是SQL Server/T-SQL的新手,在一个问题中卡了一段时间:

我有一个要与 MS Excel 结合使用的 SQL 表(包含超过 100,000 行)。我正在尝试写下一个“存储过程”来自动进行一些数据更正。我的部分数据和预期结果如下:

Current Data                    
Date    Shift   WSNo    WONo    StockNo PTime   BDPlanned
04.01.2017  1   JP-MAK-053  7148    21842   2.250,00    0
04.01.2017  1   JP-MAK-053  7148    21842   26.550,00   2.961,00
04.01.2017  1   JP-MAK-053  7148    21843   0           0
04.01.2017  1   JP-MAK-053  7148    21843   0           0

Expected Result                 
Date    Shift   WSNo    WONo    StockNo PTime   BDPlanned
04.01.2017  1   JP-MAK-053  7148    21842   28.800,00   2.961,00
04.01.2017  1   JP-MAK-053  7148    21843   28.800,00   2.961,00

1) 预期结果:

第一个“Date+Shift+WSNo (Key1)”是唯一的,SQL 语句应该计算 Key1 的“Total PTime”和/或“Total BDPlanned”。

那么基于Key1的计算结果应该均匀分布在基于第二个Unique“Date+Shift+WSNo+StokNo(Key2)”的item上。

(注意:预期结果将存储在当前表之外的新表中)

2) 为了达到结果,我尝试了下面提到的语句:

一)

CREATE TABLE #myTable1
        (Date date,
        Shift varchar(2),
        WSNo varchar(25),
        WONo Float,
        StockNo float,
        PTime float);


INSERT INTO #myTable1
SELECT Date, Shift, WSNo, WONo, SUM(PTime) AS TPTime
    FROM myTable
    WHERE WONo = 3786
    GROUP BY Date, Shift, WSNo, WONo, CONCAT(Date,'+' , Shift,'+' ,WONo)



CREATE TABLE #myTable2
        (Date date,
        Shift varchar(2),
        WSNo varchar(25),
        WONo Float,
        StockNo float,
        PTime float);

INSERT INTO #myTable2
SELECT Date, Shift, WSNo, WONo, StockNo, SUM(PTime) AS TPTime
    FROM myTable
    WHERE WONo = 3786
    GROUP BY Date, Shift, WSNo, WONo, StockNo,


SELECT  StockNo
    ,[TPTime] = CASE T21.PTime
        WHEN (
                SELECT S22.PTime
                FROM  #myTable2 T22
                WHERE T22.StockNo = T21.StockNo
                )
            THEN (
                    SELECT SUM(PTime)
                    FROM #myTable1 S11
                    WHERE T21.StockNo = T11.StockNo
                    )


FROM #myTable2 T21

错误信息: 消息 512,第 16 级,状态 1,第 1 行 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

b) 当我使用“INNER JOIN”设置另一个语句时,我得到了下面提到的错误:

“消息 4104,第 16 级,状态 1,第 2 行 无法绑定多部分标识符“T11.PTime”。”

c) 再次尝试,通过将“StockNo”设置为变量 (@StockNo),从而将计算值分配给每个临时表中的变量;我又收到了

的错误信息

“无法绑定多部分标识符“...”。”

我不确定以前是否在这个平台上回答过同样的问题,但如果你能帮我解决这个问题,我将不胜感激。

提前非常感谢你,非常抱歉我的长邮件。

最好的问候

【问题讨论】:

  • StockNo float?!也许这并不意味着我认为的意思,而是一个 stock number,例如SKU,永远不会是float。如果一个表对于给定的StockNo 有多行,那么在StockNo 上过滤only 的子查询将返回来自多行的数据。您的子查询应该返回单个值,因此您需要找到另一个过滤器来减少结果数量。 (聚合,例如Sum,会这样做。)
  • 亲爱的 HABO, 非常感谢您的 cmets 和迅速的答复。我已经将 StokNo 更改为“int”。关于 SUM 聚合:我以为我已经在 SELECT 语句中应用了它。我错过了什么吗?
  • 由于Sum 提供的聚合,SELECT SUM(PTime) FROM #myTable1 S11 WHERE T21.StockNo = 11.StockNo 将返回单个值。 SELECT S22.PTime FROM #myTable2 T22 WHERE T22.StockNo = T21.StockNo 可能会返回多个值,但您在 when 子句中需要一个值。
  • 亲爱的HABO,感谢您的cmets。我会把它们记在心里。再次感谢。最好的问候,

标签: sql-server tsql


【解决方案1】:

看来你想要窗口功能:

select Date, Shift, WSNo, WONo, StockNo, sum(PTime) over(), sum(BDPlanned) over()
from #myTable1 mt;

【讨论】:

  • 亲爱的 Yogesh, 非常感谢您的回答和快速回复。我会试试你的说法,让你知道结果。最好的毕业生...
  • 亲爱的 Yogesh,我试过你的建议,效果很好。我的声明是:select Date, Shift, WSNo, WONo, StockNo, sum(PTime) over(CONCAT(Date,'+' , Shift,'+' ,WONo)) from #myTable1 mt; 非常感谢你救了我的命:)
猜你喜欢
  • 2011-10-12
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多