SQL - создать флаг в запросе, чтобы выделить порядок, который содержит количество = 1 - PullRequest
0 голосов
/ 18 ноября 2018

Я пытался создать заявление о ситуации, но, похоже, не дает мне то, что я хочу. Я хотел бы получить разделение таблицы (которая находится на уровне продукта) и агрегировать на уровне заказа элементы, которые содержат количество 1.

Есть идеи, как мне это сделать?

order id | Product | Quantity 
---------+---------+--------------
 11111   | sdsd4   | 1 (single item )
 22222   | sasas   | 1 (multiple items)
 22222   | wertt   | 1 (multiple items)

Я хотел бы получить регистр, чтобы добавить еще один столбец для разделения заказов с количеством = 1 и заказами больше 1

Есть идеи, как мне это сделать?

Желаемым результатом будет столбец в (скобках)

Я мог бы тогда посчитать заказы и ввести вновь созданный столбец как измерение

Подробнее здесь:

введите описание изображения здесь

Прикреплено изображение структуры таблицы.

Логика, если количество = 1 и 1 заказ, то заказ одного товара если в заказе есть один товар, но несколько товаров одного и того же товара если в заказе более одного товара, то не единичный заказ

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Если ваша база данных поддерживает аналитические функции, вы можете использовать такой запрос:

SELECT *,
      CASE WHEN count("Product") OVER (partition by "order id") > 1
      THEN 'multiple items' ELSE 'single item'
      END As "How many items"
FROM Table1

Демо: https://dbfiddle.uk/?rdbms=postgres_11&fiddle=b659279fc16d2084cb1cf4a3bea361a1

0 голосов
/ 18 ноября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  CASE COUNT(DISTINCT Product) OVER(PARTITION BY order_id) 
    WHEN 1 THEN 'Single Item Order'
    ELSE 'Multipple Items Order'
  END Single_or_Multiple
FROM `project.dataset.table`

Вы можете протестировать, поиграть с выше, используя фиктивные данные, как показано ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 11111 order_id, 'sdsd4' Product, 1 Quantity UNION ALL
  SELECT 22222, 'sasas', 2 UNION ALL
  SELECT 22222, 'wertt', 1
)
SELECT *, 
  CASE COUNT(DISTINCT Product) OVER(PARTITION BY order_id) 
    WHEN 1 THEN 'Single Item Order'
    ELSE 'Multipple Items Order'
  END Single_or_Multiple
FROM `project.dataset.table`   

с результатом

Row order_id    Product Quantity    Single_or_Multiple   
1   11111       sdsd4   1           Single Item Order    
2   22222       sasas   2           Multipple Items Order    
3   22222       wertt   1           Multipple Items Order    
0 голосов
/ 18 ноября 2018

Если я правильно понимаю, вы можете использовать подзапрос, чтобы получить количество записей для заказа и пометить запись, если это число больше 1 и количество равно 1.

SELECT t1.order_id,
       t1.product,
       t1.quantity,
       CASE
         WHEN t1.quantity = 1
              AND (SELECT count(*)
                          FROM elbat t2
                          WHERE t2.order_id = t1.order_id) > 1 THEN
           'flag'
         ELSE
           'no flag'
       END flag
       FROM elbat t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...