SQL Python указанный пользователем запрос - PullRequest
0 голосов
/ 30 октября 2019

У меня есть следующий оператор 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 |
+---------+-----------+--------+-------------+------------+----------+-------+------------+

Я использую DB Browser для SQlite3. ДЛЯ ЗАМЕЧАНИЯ: я сократил записи в обеих базах данных, чтобы минимально воспроизвести это, но есть запись для каждого дня года в столбце orderDate в моем реальном браузере, и есть другие примеры различных продуктов, заказанных во второй таблице,но я сократил это для этого примера.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Запрос может быть намного проще, чем показанный. Например, если вам нужно получить результаты для «Cappucino», вы можете просто:

+---------+-----------+--------+-------------+------------+----------+-------+------------+
| 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   |
+---------+-----------+--------+-------------+------------+----------+-------+------------+

select sum(quantity*price), strftime("%m-%Y", orderDate) as month 
from coffee
where product = 'Cappucino'
group by product, month

+---------+-----------+
|  sales  |   month   |
+---------+-----------+
|       3 |  10-2019  |
|       2 |  11-2019  |
|       2 |  12-2019  |
+---------+-----------+

Очевидно, что вам нужно настроить параметр «Cappucino» так, чтобы он принимал любой возможный продукт, который будет вставлен из стандарта. команда input (input () в Python) и условие фильтрации, безусловно, могут быть изменены в соответствии с вашими потребностями. В любом случае, я создал демонстрацию на SQLFiddle, которую вы можете увидеть и попробовать здесь

0 голосов
/ 30 октября 2019

Вы просто ищете запрос агрегации?

select orderdate, product, sum(quantity * price) as total_sales
from t
group by orderdate
order by orderdate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...