Указанный пользователем запрос 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)

Вот типичный вывод:

Введите столбец для поискаЭспрессо

(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')

Однако приведенная выше таблица была тестовой и не соответствует формату моей фактической таблицы, в которую поступают заказы клиентов. Как мне адаптировать запрос для выбора ежемесячных продаж каждого продукта из новой таблицы, если нет заголовков продуктов, а вместо них ячейки с названием продукта под столбцом product. Вот моя фактическая таблица, для которой я хотел бы использовать этот запрос:

+---------+-----------+--------+-------------+------------+----------+-------+------------+
| 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, а во второй таблице есть больше примеров различных продуктов, заказанных, но я сократил его для этого примера.


person TheDestroyer    schedule 30.10.2019    source источник
comment
Сначала взгляните на минимально воспроизводимый пример. Затем добавьте некоторые примеры данных таблицы и ожидаемый результат. (В виде форматированного текста, без изображений.)   -  person jarlh    schedule 30.10.2019
comment
Привет, я внес изменения в сообщение. С Уважением   -  person TheDestroyer    schedule 30.10.2019


Ответы (2)


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

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

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

person Christian Cavuti    schedule 30.10.2019

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

select orderdate, product, sum(quantity * price) as total_sales
from t
group by orderdate
order by orderdate;
person Gordon Linoff    schedule 30.10.2019