Первый раз постер и просто ищу какое-то руководство по написанию описания дела. Я хотел бы вытащить следующее из одной таблицы

общее количество заказов за неделю отменил заказы на неделю % заказов отменено

Я немного прочитал описания случаев, но не смог найти именно то, что искал. Я предполагаю, что заявление case будет чем-то вроде

«случай, когда заказ =« отменил », то количество заказов», но я также знаю, что это неправильно, поэтому просто ищу некоторую помощь.

Заранее спасибо!

-et

0
etaylor07 30 Дек 2019 в 21:08
1
Можете ли вы отредактировать свой пост и добавить образцы данных и ожидаемые результаты? Кроме того, не могли бы вы пометить свой вопрос, указав, какую СУБД вы используете. Это поможет нам дать вам лучший ответ на ваш вопрос
 – 
dvo
30 Дек 2019 в 21:10
2
Образцы данных, желаемые результаты и соответствующий тег базы данных были бы очень полезны.
 – 
Gordon Linoff
30 Дек 2019 в 21:11

2 ответа

Обычный способ подсчета частичных строк состоит в том, чтобы выполнить count запрос с предложением where, чтобы выбрать, какие строки. Каждый из них может быть соединен с другими аналогичными запросами.

Способ сделать это за один выбор с помощью case - поместить case внутри sum:

SELECT SUM(case when order = 'cancelled' THEN 1 ELSE 0 END) AS cancelled, ...
0
karmakaze 30 Дек 2019 в 22:04

Вам, вероятно, следует создать вложенный запрос для этого: во-первых, создайте свой запрос, чтобы отсортировать вещи по неделям.

SELECT orderID, orderStatus, DATEPART(week, orderDate) as orderWeek
FROM orders

Тогда вы, вероятно, можете получить выбор из этого следующим образом:

SELECT count(orderID) OVER(PARTITION BY orderWeek) AS Total
,count(orderID) OVER(PARTITION BY orderWeek, orderStatus) AS CountPerStatus
,orderWeek
FROM (SELECT orderID, orderStatus, DATEPART(week, orderDate) as orderWeek
FROM orders) a

Добавить, а затем, наконец, получить ваши итоги в одной строке:

SELECT Total, CountPerStatus, orderWeek
FROM (
    SELECT count(orderID) OVER(PARTITION BY orderWeek) AS Total
    ,count(orderID) OVER(PARTITION BY orderWeek, orderStatus) AS CountPerStatus
    ,orderWeek
    FROM (
        SELECT orderID, orderStatus, DATEPART(week, orderDate) as orderWeek
        FROM orders
) a
) b
WHERE CountPerStatus = 'Cancelled'

Это может быть явно упрощено, но я предпочитаю указать это для лучшего понимания. Надеюсь, это поможет.

0
Pierre 30 Дек 2019 в 22:15