要求输入一个已经存在的参数值

Asking to enter a parameter value that already exists

我有一个名为 "FPB" 的三列 table 价格区间,看起来像这样:

[Part Number] [Quantity] [Price]
 AAA-AAAA     100   1.23
 AAA-AAAA     200   1.15
 BBB-BBBB     100   5.60
 CCC-CCCC      500   3.21
 ....

其中每个零件号在多行中有多个条目。

我正在尝试重新组织 table 使其看起来更像这样

[Part Number] [Quantity1] [Price 1] [Quantity 2] [Price 2] [Quantity 3....
AAA-AAAA      100   1.23     200       1.15   ....
BBB-BBBB      100   5.60     ...
CCC-CCCC       500   3.21     ...
...

其中每个零件号的所有条目都合并到一行中。第一个数量列应该有最低的可用数量,第二个应该有第二小的数量,等等。我试图通过首先使用 GROUP BY 创建一个只有唯一零件号的 1 列 table,然后为每个列中包含我想要的信息的列创建更多 tables,然后按部件号加入它。在倒数第二个部分计算每种类型的第二小数量时出现问题。

SELECT PNs.[Part Number], Q1T.Q1, P1T.Price, Q2T.Q2
FROM
(SELECT
[Part Number]
FROM FPB
GROUP BY [Part Number]
) AS PNs,

(SELECT
[Part Number],
MIN(Quantity) AS Q1
FROM FPB
GROUP BY [Part Number]
) AS Q1T,

(SELECT
*
FROM FPB
) AS P1T,

(SELECT
[Part Number],
MIN(IIF(Quantity>Q1T.Q1,Quantity)) AS Q2
FROM FPB
GROUP BY [Part Number]
) AS Q2T

WHERE
PNs.[Part Number] = Q1T.[Part Number]
AND P1T.[Part Number] = PNs.[Part Number]
AND P1T.Quantity = Q1T.Q1
AND Q2T.[Part Number] = PNs.[Part Number]

当我 运行 这个查询时,它要求我输入 Q1T.Q1 的参数值,即使它已经存在。如果我删除 Q2T 的代码部分以及对 Q2 的任何引用,它将正常工作,并且它不会询问 Q1T.Q1 的其他实例的值。为什么 Q1T.Q1 没有那个部分的值,我该如何解决?作为旁注,我正在使用名为 PHPRunner 的程序的 SQL 功能,它的客户端不支持 UPDATE/DELETE/INSERT/CREATE 查询、UNION 和 DISTINCT。

根据您的问题,当您定义派生的 table Q2T 时,Q1T 仍然是一个无效对象。您需要尝试解决此问题。

编辑: 假设你只有 2 级列要处理,代码如下,我测试过。效果不错。

select q5.*,q3.quantity, q3.price

from

(select *
from FPB as Q1
where 0 = (select count(distinct(quantity)) from FPB as Q2 where Q2.quantity < Q1.quantity AND Q2.[part number] = Q1.[part number])) as Q5
,
(
select distinct(temp.[part number]),Q2.quantity, Q2.price from FPB as temp
left join
(select *
from FPB as Q4
where 1 = (select count(distinct(quantity)) from #test as Q2 where Q2.quantity < Q4.quantity AND Q2.[PART NUMBER] = Q4.[PART NUMBER])) as Q2
on temp.[PART NUMBER] = Q2.[PART NUMBER]
) as Q3

where Q5.[PART NUMBER] = Q3.[PART NUMBER]

您调用的查询不正确。

Q1T 是内部 select 语句,而在 Q2T(其他内部 select 语句)中,您不能使用 Q1T

中的任何字段

SQL 服务器引发错误:')' 附近的语法不正确。

要克服此限制,您应该使用 通用 Table 表达式 CTE 对于 PN、Q1T、P1T、Q2T

CTE 就像动态视图。 这是自 sql 2008 年以来的一项新功能,非常强大。

评论:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

尝试为这四个CTE绘制一个关系数据模型,以确保它们之间存在基于您的where条件的关系。 我认为此查询中的逻辑可能会在执行期间引发运行时错误:

例如无法绑定多部分标识符 "Q1T.Q1"。

编辑:

对于 Ms-Access 您可以创建四个查询:PNs、Q1T、P1T、Q2T 每个都在一个单独的查询中,第五个查询加入这些查询并添加哪里的条件。 在这种情况下,您不会收到任何语法错误。并将获得 数据模型 与免费关系 :) .

您正在寻找这样的东西。

select
    p1.PartNumber,
    ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
    p1.Quantity as UpperQuantity,
    p1.Price,
    count(p2.PartNumber) + 1 as PriceTier
from
    FPB p1 left outer join FPB p2
        on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity

从那里很容易旋转以插入新的 table:

into into NewFPB (PartNumber, Quantity1, Price1, Quantity2, Price2, ...)
select
    PartNumber,
    min(switch(PriceTier = 1, UpperQuantity)) as Quantity1,
    min(switch(PriceTier = 2, UpperQuantity)) as Quantity2, ...
    min(switch(PriceTier = 1, Price)) as Price1,
    min(switch(PriceTier = 2, Price)) as Price2, ...        
from (
    select
        p1.PartNumber,
        ifnull(max(p2.Quantity), 0) + 1 as LowerQuantity,
        p1.Quantity as UpperQuantity,
        p1.Price,
        count(p2.PartNumber) + 1 as PriceTier
    from
        FPB p1 left outer join FPB p2
            on p2.PartNumber = p1.PartNumber and p2.Quantity < p1.Quantity
) data

您可能需要稍微调整一下,Access 才能接受它。但是核心思想在那里。