首页 > 解决方案 > 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 列中有一年中每一天的记录,并且在我的第二个表中订购了更多不同产品的示例,但我已经为这个例子减少了它。

标签: pythonsqlpython-3.xsqlite

解决方案


您只是在寻找聚合查询吗?

select orderdate, product, sum(quantity * price) as total_sales
from t
group by orderdate
order by orderdate;

推荐阅读