【问题标题】:Output of invoice from number of tables从表数输出发票
【发布时间】:2011-08-27 03:04:11
【问题描述】:

我有以下表格

customers

cust_id     cust_name
1           a company
2           a company 2
3           a company 3

tariffs

tariff_id   cost_1     cost_2     cost_3
1           2          0          3
2           1          1          1
3           4          0          0


terminals

term_id     cust_id      term_number     tariff_id
1           1            12345           1
2           1            67890           2
3           2            14324           1
4           3            78788           3

usage

term_ident  usage_type   usage_amount    date
12345       1            20              11/12/2010
67890       2            10              31/12/2010
14324       1            1               01/01/2011
14324       2            5               01/01/2011
78788       1            0               14/01/2011

在现实生活中,表格非常大 - 有 5000 个客户、250 个资费、500000 个终端和 500 万条使用记录。

在终端表中 - term_id、cust_id 和关税_id 都是外键。使用表中没有外键 - 这只是从 csv 文件导入的原始数据。

使用表中可能存在终端表中不存在的终端 - 这些可以忽略。

我需要为每位客户开具使用发票。我只想包括 2010 年 12 月 15 日到 2011 年 1 月 15 日之间的使用情况——这是计费期。我需要根据其关税计算使用发票的行项目......例如:取使用表中的第一条记录 - usage_1 的成本(对于 term_id 1)将是 90x2=180,这是因为term_ident 使用关税 ID 编号 1。

输出应该如下

Customer 2

date         terminal  usage_cost_1  usage_cost_2  usage_cost_3  total cost
01/01/2011   14324     18            0             6             24

我是一名称职的 PHP 开发人员 - 但只是 SQL 的初学者。我需要一些建议是生成发票的最有效过程 - 也许有一个 SQL 查询可以在 PHP 处理开始计算成本之前帮助我 - 或者 SQL 语句也可能产生成本?欢迎任何建议....

编辑:

1) 目前有一些东西正在运行这个进程 - 它是用 C++ 编写的,大约需要 24 小时来处理这个......我无法访问源代码。

2) 我在 Symfony 中使用 Doctrine——我不确定 Doctrine 对检索数据有多大帮助,因为 Objects 只会减慢这个过程——而且我不确定使用 Objects 在这里是否会有太大帮助?

编辑@13:54 ->

使用表指定不正确...抱歉!

我必须将usage_type映射到每个终端的特定关税成本,即usage_type 1 = cost_1 in适当的关税......我想这会让它稍微复杂一些?

【问题讨论】:

  • 我怎么知道 term_ident=12345 使用了关税 ID=1?它是否使用从 1 到 5 的所有关税 ID?
  • 这不应该花费任何时间接近 24 小时..
  • @Nick ...这正是我所说的......他们回答......“如果你能做得更快,那就去吧!”
  • 凭借我有限的(基本查询/更新和删除)sql 知识 - 我将运行大量 SQL 查询来提取数据,然后在 PHP 中处理它们 - 但我确信有一个在(也许?)1/2 查询中获取所有数据的更有效方式?

标签: php mysql sql symfony1


【解决方案1】:

你去吧,应该不到 24 小时 ;)

SELECT u.date, u.term_ident terminal,
    (ta.cost_1 * u.usage_1) usage_cost_1,
    (ta.cost_2 * u.usage_2) usage_cost_2,
    (ta.cost_3 * u.usage_3) usage_cost_3,
    (usage_cost_1 + usage_cost_2 + usage_cost_3) total_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
    AND c.cust_id = 2

此查询仅适用于 cust_id = 2 的客户。如果您想要整个数据集的结果,只需删除条件即可。

更新

您的新要求并非易事。您可以将使用表转换为您之前发布的新表。

要在 SELECT 查询中做出决定,您可以执行以下操作。但这不是您期望的结果。它可用于创建转换后的新使用表。

SELECT u.date, u.term_ident terminal,
    CASE u.usage_type
        WHEN 1 then ta.cost_1 * u.usage_1
        WHEN 2 then ta.cost_2 * u.usage_2
        WHEN 3 THEN ta.cost_3 * u.usage_3
    AS usage_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
    AND c.cust_id = 2

【讨论】:

  • 谢谢 ....也许我的问题措辞不够好或解释不够...我必须为每个客户开具发票...我想我会为每个客户发出上面的查询客户(显然更改了 WHERE 子句)... Dates 将是一个附加的 where 子句... WHERE date #
  • 对不起,我忘记了日期。如果您告诉我日期的列类型,我会更新我的答案。
  • @Alp .... 我在使用表设置上犯了一个小错误-非常抱歉-只有在我尝试运行您的查询时才发现它...希望您可以更新您的查询以帮助我?
  • 现在,我无法提供快速的解决方案。在更新的答案中查看我的第一种方法。
  • 我会试试看它有多快...我有一些测试数据可以使用...感谢您的帮助@Alp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多