如何根据价格确定哪个客户购买了商品

时间:2017-07-03 03:58:54

标签: mysql sql vb6

我有两个名为transdtinv_sldtl的表。

transdt表包含客户ID和客户购买商品的总价。

+----------+-----------+-----------+------------+------------+----------+
| BranchID | TransCode | ControlNo | CustomerID |    Date    | Amount   |
+----------+-----------+-----------+------------+------------+----------+
|        1 |        48 |       469 |       1170 | 2017-05-01 | 295.00   |
|        1 |        48 |       469 |       1185 | 2017-05-01 | 44257.24 |
+----------+-----------+-----------+------------+------------+----------+

并且inv_sldtl包含商品ID,单位成本,数量和总费用。

+----------+-----------+--------+-----------+------------+----------+----------+-----------+
| BranchID | TransCode | ItemID | ControlNo |    Date    | Quantity | UnitCost | TotalCost |
+----------+-----------+--------+-----------+------------+----------+----------+-----------+
|        1 |        48 |    108 |       469 | 2017-05-01 | 1.00     | 45.00    | 45.00     |
|        1 |        48 |    736 |       469 | 2017-05-01 | 10.00    | 25.00    | 250.00    |
|        1 |        48 |    622 |       469 | 2017-05-01 | 4.00     | 280      | 1120.00   |
|        1 |        48 |    500 |       469 | 2017-05-01 | 4.00     | 10784.31 | 43137.24  |
|          |           |        |           |            |          |          |           |
+----------+-----------+--------+-----------+------------+----------+----------+-----------+

鉴于两个表的结果在同一个事务中,由ControlNo确定。

有什么方法可以像这样输出吗?

+-----------+-----------+------------+--------+------------+
| ControlNo | TransCode | CustomerID | ItemID |    Date    |
+-----------+-----------+------------+--------+------------+
|       469 |        48 |       1170 |    108 | 2017-05-01 |
|       469 |        48 |       1170 |    736 | 2017-05-01 |
|       469 |        48 |       1185 |    622 | 2017-05-01 |
|       469 |        48 |       1185 |    500 | 2017-05-01 |
+-----------+-----------+------------+--------+------------+

我认为我们可以根据Amount表中的transdtTotalCost表中的inv_sldtl来确定它。但是怎么样?

编辑:由于SQL似乎没有这方面的解决方案,我如何使用VB6作为我的编程语言来实现这一点,就像@ThorstenKettner所说的那样?

谢谢:)

2 个答案:

答案 0 :(得分:1)

您必须构建所有项目组合,以便将这些项目与客户的总数进行比较。

pack #1    | pack #2    | sums
-----------+------------+-----------------
item 1     | item 2+3+4 | 45.00 , 44507.24
item 1+2   | item 3+4   | ...
item 1+3   | item 2+4   | ...
item 1+4   | item 2+3   | ...
item 1+2+3 | item 4     | ...
item 2     | item 1+3+4 | ...
item 2+3   | item 1+4   | ...
...

这不是SQL的任务。至少不适用于不支持递归查询的DBMS。所以请改用编程语言。即使用Java,C#,无论如何,读取数据,然后通过调用递归函数来获得总数。

更新:您已请求有关该算法的进一步帮助。这是一种可能的方式:

  1. 这里有一组n个客户(1170,1185)。
  2. 你有一套m项,这里(108,500,622,736)。
  3. 以最低总客户为客户,客户为1170,客户为295.00。
  4. 查找与价格匹配的商品组合。您将使用递归函数调用,并在价格过高时立即停止。因此,您很快就会得到项目108 = 45.00,项目736 = 250.00和项目108 + 736 = 295.00。只有最后一个组合才是匹配。
  5. 从客户群中删除客户。从项目集中删除项目。
  6. 继续第3步,直至完成。
  7. 要使这一点变得更复杂:您看到您可以为客户提供多个匹配项,例如:项目A + B和项目B + C + D都与客户总数相匹配。因此,必须为每场比赛完成第5步和以下步骤。另一个递归: - )

    一步一步地慢慢地这样做,以免弄糊涂。祝你好运: - )

答案 1 :(得分:0)

不知道你想要什么,如果你有主键或外键,如果你没有,你应该在第一个表中使用你的ControlNo转换你的inv_sldt1中的PK和FK,这样你就可以使用下面我的代码。这样,您还可以通过某些列将表链接在一起。无论如何,如果没有看到这里的所有内容,我会立即查看它并告诉我。

SELECT CustomerID, Date, Quantity 
FROM transdt
INNER JOIN inv_sldt1 ON transdt.ControlNo=inv_sldt1.ControlNo
WHERE ItemID = 108