python - SQL Python 用户指定查询
问题描述
我有以下 SQL 语句来选择存储在我的数据库中的每个产品的月销售额。基于用户输入选择产品。该查询适用于该表。
+------------+----------+-------+-------+-----------+
| orderDate | Espresso | Latte | Mocha | Cappucino |
+------------+----------+-------+-------+-----------+
| 2019-01-01 | 18 | 20 | 10 | 12 |
| 2019-01-02 | 13 | 11 | 20 | 10 |
| 2019-01-03 | 12 | 14 | 13 | 14 |
| 2019-01-04 | 20 | 13 | 15 | 14 |
| 2019-01-05 | 17 | 18 | 11 | 16 |
+------------+----------+-------+-------+-----------+
import sqlite3
title = input("Enter column to search")
sql = """SELECT SUM(sub.sales) as total_sales,
strftime("%m-%Y", sub.[orderDate]) as 'month-year'
FROM
(SELECT [orderDate], Espresso AS sales, 'Espresso' as item
FROM groupedSales
UNION ALL
SELECT [orderDate], Latte AS sales, 'Latte' as item
FROM groupedSales
UNION ALL
SELECT [orderDate], Mocha AS sales, 'Mocha' as item
FROM groupedSales
UNION ALL
SELECT [orderDate], Cappucino AS sales, 'Cappucino' as item
FROM groupedSales
UNION ALL
SELECT [orderDate], Americano AS sales, 'Americano' as item
FROM groupedSales
UNION ALL
) AS sub
WHERE sub.[item] = ? AND milkOptions = 'Soya'
GROUP BY strftime("%m-%Y", sub.[orderDate])
"""
conn=sqlite3.connect("system.db")
cur=conn.cursor()
aggregateIndividuals = cur.execute(sql, (title, milkOptions,)).fetchall()
valueArray = []
valueArray2 = []
for values in aggregateIndividuals:
print(values)
这是一个典型的输出:
输入列搜索Espresso
(494, '01-2019')
(440, '02-2019')
(447, '03-2019')
(447, '04-2019')
(452, '05-2019')
(439, '06-2019')
(433, '07-2019')
(482, '08-2019')
(443, '09-2019')
(440, '10-2019')
(441, '11-2019')
(458, '12-2019')
但是,上面的表格是测试数据,并不代表我输入客户订单的实际表格的格式。鉴于没有产品标题,而是产品列下的产品名称单元格,我将如何调整查询以从新表中选择每个产品的月销售额。这是我想在其上使用此查询的实际表:
+---------+-----------+--------+-------------+------------+----------+-------+------------+
| orderid | product | size | milkOptions | orderDate | quantity | price | customerid |
+---------+-----------+--------+-------------+------------+----------+-------+------------+
| 1 | Espresso | Small | Soya | 2019-10-29 | 1 | 1.0 | 1 |
| 2 | Cappucino | Small | SemiSkimmed | 2019-10-29 | 1 | 1.0 | 1 |
| 3 | Cappucino | Small | SemiSkimmed | 2019-10-29 | 1 | 1.0 | 1 |
| 4 | Cappucino | Medium | SemiSkimmed | 2019-10-29 | 1 | 1.0 | 1 |
+---------+-----------+--------+-------------+------------+----------+-------+------------+
我正在为 SQlite3 使用数据库浏览器。注意:我已经减少了两个数据库上的记录以最小化重现这一点,但是在我的实际浏览器的 orderDate 列中有一年中每一天的记录,并且在我的第二个表中订购了更多不同产品的示例,但我已经为这个例子减少了它。
解决方案
您只是在寻找聚合查询吗?
select orderdate, product, sum(quantity * price) as total_sales
from t
group by orderdate
order by orderdate;