使用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,因此该项目需要具有该项目的正确价格和成本显示。