使用VBA、SQL三个表中的值查找边距

使用VBA、SQL三个表中的值查找边距,sql,excel,vba,db2,Sql,Excel,Vba,Db2,几个月来我一直在这上面。以下是示例表、我正在使用的代码以及我遇到的问题: ITEM MFGR | CLR | PAT | Desc1 | Desc2 | Price | Cost -----|-----|-----|-------|-------|-------|------ MMM | 001 | 001 | BLAH | BLAH | MMM01 | MMM01 MMM | 002 | 002 | BLAH | BLAH | MMM02 | MMM02 MMM | 003 |

几个月来我一直在这上面。以下是示例表、我正在使用的代码以及我遇到的问题:

ITEM

MFGR | CLR | PAT | Desc1 | Desc2 | Price | Cost
-----|-----|-----|-------|-------|-------|------
MMM  | 001 | 001 | BLAH  | BLAH  | MMM01 | MMM01
MMM  | 002 | 002 | BLAH  | BLAH  | MMM02 | MMM02
MMM  | 003 | 003 | BLAH  | BLAH  | MMM03 | MMM03
MMM  | 004 | 004 | BLAH  | BLAH  | MMM04 | MMM04
MMM  | 005 | 005 | BLAH  | BLAH  | MMM04 | MMM05


PRICE
/* The P1, P2, P3, etc. are prices for different quantities */
/* T1 tier is just better pricing and quantity breaks for high volume customer */

PRICE | TIER | LISTP | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 | P11 | P12
------|------|-------|----|----|----|----|----|----|----|----|----|-----|-----|-----
MMM01 |  LP  |  $10  |$10 | $9 | $8 | $7 | $6 |    |    |    |    |     |     |     
MMM01 |  T1  |  $10  |$8  | $7 | $6 | $5 | $4 |    |    |    |    |     |     |
MMM02 |  LP  |  $20  |$20 |$18 |$16 |$14 |$12 |    |    |    |    |     |     |
MMM02 |  T1  |  $20  |$16 |$14 |$12 |$10 | $8 |    |    |    |    |     |     |
....


COST

 COST | LASTC 
------|-------
MMM01 | $5
MMM02 | $10
因此,我使用VBA和SQL从IBMDB2数据库直接导入Excel。无论出于什么原因,我没有任何其他选择或应用程序可供选择,所以这就是我必须要做的

我试图完成的是生成一个项目列表,这些项目有一个保证金,无论是标价、价格层还是低于VBA InputBox指定的GPM的数量中断。任何价格点低于X的物品都需要显示在报告中

这是我一直在使用的代码,以及我遇到的两个问题,我将随后解释:

SELECT i.MFGR || i.CLR || i.PAT as Item, i.DESC1 as Description1, 
i.DESC2 as Description2, i.PRICE as PClass, i.COST as CClass, p.TIER as Tier, 
c.LASTC as Cost, p.LISTP as List, ((p.LISTP-c.LASTC)/p.LISTP) as GPM, p.P2 as Price2, 
((p.P2-c.LASTC)/p.P2) as GPM2, p.P3 as Price3, ((p.P3-c.LASTC)/p.P3) as GPM3, 
p.P4 as Price4, ((p.P4-c.LASTC)/p.P4) as GPM4, p.P5 as Price5, 
((p.P5-c.LASTC)/p.P5) as GPM5, p.P6 as Price6, ((p.P6-c.LASTC)/p.P6) as GPM6, 
p.P7 as Price7, ((p.P7-c.LASTC)/p.P7) as GPM7, p.P8 as Price8, 
((p.P8-c.LASTC)/p.P8) as GPM8, p.P9 as Price9, ((p.P9-c.LASTC)/p.P9) as GPM9, 
p.P10 as Price10, ((p.P10-c.LASTC)/p.P10) as GPM10, p.P11 as Price11, 
((p.P11-c.LASTC)/p.P11) as GPM11, p.P12 as Price12, ((p.P12-c.TLASTC)/p.P12) as GPM12 
FROM ITEM i
LEFT JOIN COST c
     ON i.COST = c.COST
LEFT JOIN PRICE p
     ON i.PRICE = p.PRICE
WHERE (((p.LIST-c.LASTC)/p.LIST) < '" & margin & "') 
ORDER BY i.MFGR || i.CLR || i.PAT
第一个问题:这显示了LP层的价格折扣,但不是T1层的价格折扣。它只显示T1的LISTP列。它应该显示它后面的所有P1、P2、P3等。是的,我已经验证了我的T1文件是否有P1、P2等值

但这个查询并没有给出我真正想要的东西,因为我想让它拉任何价格低于某个GPM的物品。因此,我将where语句修改为:

/* I will eventually add margin calculations for P3, P4, etc. */
/* but can't even get this to work, so not point in it yet */

WHERE (((p.LIST-c.LASTC)/p.LIST) < '" & margin & "') OR 
(((p.P2-c.LASTC)/p.P2) < '" & margin & "' )
所以即使我输入的利润率是20%,标价超过了20%,但是P2在下面,这个项目还是应该出现,对吗?不。每次我都会收到一个错误,上面写着:运行时错误“1004”:常规ODBC错误。如果我输入了错误的列名,我通常会得到这个结果,但我可以向您保证,我已经做了尽职调查,我所有的列名都是正确的,应该导入的数据已经验证确实存在,我已经调整了数据以获得可预测的结果,尝试了括号的所有组合,等等

如果我将OR改为AND,ODBC错误就会消失,但这不是我想要做的,因为这意味着如果LP和P2都低于边距。。。我要么要,要么要

那么我做错了什么呢?

这应该会让你走上正轨

这是针对SQL Server的,但我相信所有命令都是标准的,因此应该在DB2中工作

DECLARE @TARGET FLOAT = 0.2

SELECT P.PRICE, P.TIER, P.P, P.PRICES, C.LCOST, (P.PRICES-C.LCOST)/P.PRICES MARGIN, @TARGET TARGET
FROM   (SELECT PRICE, TIER, P, PRICES
        FROM   PRICE
        UNPIVOT
        (
          PRICES 
          FOR P IN (LISTP, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12)
        ) U
       WHERE PRICES <> 0) P
       LEFT JOIN
       COST C on P.PRICE=C.COST
WHERE  (P.PRICES-C.LCOST)/P.PRICES < @TARGET;

这样做的目的是取消对现有表的绑定,以便将价格转换为行的列-这样连接就很简单了

嗨,我真的没法让它工作。它似乎忽略了项目表的使用,项目表是价格和成本之间的中介。原因是P.PRICE并不总是等于C.COST,因此该项目需要具有该项目的正确价格和成本显示。