【发布时间】: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