在存在条件的数据库中查找非唯一值

时间:2018-04-01 07:32:15

标签: python sql sqlite

我使用的是SQLite服务器,但我不明白如何实现目标。

我有一个名为billing的数据库,如下所示:

+------------+---------+-------+---------+--------+
|         ID | Account | Date  | Product | Charge |
+------------+---------+-------+---------+--------+
|          1 |       1 | 04-01 | Water   |  20    |
|          1 |       1 | 04-02 | Water   |  20    |
|          2 |       2 | 06-01 | Phone   |  30    |
|          2 |       3 | 08-04 | Water   |  40    |
+------------+---------+-------+---------+--------+

我试图找到所有产品组合的所有最新费用的总和。这意味着,我需要将ID-1的20美元(因为它不是最近的时间而被忽略,因为它不是最近的那个)用于他们的水费,以及ID-2的水和电话费用为30美元和40美元。

现在,我正在使用Python的sqlite3模块并使用:

for i in range (2):
    c.execute("SELECT Charge FROM billing WHERE ID = " + str(i+1) + " ORDER BY Date DESC")
    rows = c.fetchone()
    sum.x += rows[0]
print("Todays Sum = $" + str(sum.x))

但是使用此方法只能计算ID-2中的一个值。最近的一个不计算因为数据库正在下降。

如何应用ID必须唯一的条件,同时还要寻找非独特的产品?

2 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT SUM(b1.Charge)
FROM billing b1
INNER JOIN
(
    SELECT Account, Product, MAX(Date) AS max_date
    FROM billing
    GROUP BY Account, Product
) b2
    ON b1.Account = b2.Account AND
       b1.Product = b2.Product AND
       b1.Date = b2.max_date;

这里的一个重要假设是您的日期以YY-MM格式存储。如果您将它们存储为MM-YY,那么他们就无法正确排序,您的桌面会遇到更大的问题。

答案 1 :(得分:0)

请将查询更改为以下内容并重试:

SELECT sum(Charge) FROM billing WHERE ID = " + str(i+1) + " group by id ORDER BY Date DESC