Перечислить клиента и товар без продажи - PullRequest
0 голосов
/ 11 июля 2020

Необходимо отобразить следующие столбцы (3), используя UNION для возврата:

  • Все клиенты, у которых нет счета
  • Все продукты, которые не были проданы
  1. Категория: Это связано с «покупателем» или «продуктом»? Выведите «покупатель или продукт»
  2. ID: Customer.id (category = "customer") или product.id (category = "product")
  3. Имя: customer.customer_name (category = "customer") или product.product_name (category = "product")

Таблицы:

Customer

  • id
  • customer_name
  • city_id
  • customer_address
  • contact_person
  • email
  • phone

Товар

  • id
  • sku
  • product_name
  • product_description
  • текущая_цена
  • количество_в_стоке

Счет-фактура

  • id
  • invoice_number
  • customer_id
  • user_account_id
  • total_price
  • time_issued
  • time_due
  • time_paid
  • time_canceled
  • time_refunded

Invoice_Item

  • id
  • invoice_id
  • product_id
  • количество
  • цена
  • line_total_price

На данный момент есть следующее:

SELECT 
  category,
  CASE
      WHEN category = 'customer' THEN c.id
      WHEN category = 'product' THEN p.id
  END AS 'id',
  CASE
    WHEN category = 'customer' THEN c.customer_name
    WHEN category = 'product' THEN p.product_name
  END AS 'name'
FROM 
  (
    SELECT
        CASE
          WHEN c.id = c.id THEN 'customer'
          WHEN p.id = p.id THEN 'product'
        END as 'category'
    FROM
        customer as c
    LEFT Join -- Left join to show all customers even those with & without invoices
        invoice as i
    ON c.id = i.customer_id
    AND i.id IS NULL -- Gives me all customers who do not have an invoice
    JOIN invoice_item as ii
    ON i.id = ii.invoice_id
    Join product p
    ON p.id = ii.product_id
  ) tb1

UNION ALL

SELECT 
  category,
  CASE
      WHEN category = 'customer' THEN c.id
      WHEN category = 'product' THEN p.id
  END AS 'id',
  CASE
    WHEN category = 'customer' THEN c.customer_name
    WHEN category = 'product' THEN p.product_name
  END AS 'name'
FROM
  (
    SELECT 
      CASE
        WHEN c.id = c.id THEN 'customer'
        WHEN p.id = p.id THEN 'product'
      END as 'category'
    FROM
        product as p
    LEFT JOIN -- Left join to show all products even those that sold and not sold
        invoice_item as ii
    ON p.id = ii.product_id
    AND ii.invoice_id IS NULL -- Gives me products that didnt sell
    JOIN invoice as i
    ON ii.invoice_id = i.id
  ) tb2

Открыт для любых предложений, так как я застрял, пытаясь выяснить, как показать категорию как «продукт» или «клиент». Заранее спасибо!

1 Ответ

0 голосов
/ 11 июля 2020

Учитывая вашу модель данных и требования, вам следует попробовать следующие SQL-запросы. Вы можете легко выполнить UNION с обоими SQL-запросами.

Первый SQL возвращает этот список -> Все клиенты, у которых нет счета

select 'customer' as category, c.id as id, customer_name as name
     from customer c
     left join invoice i on c.id = i.customer_id
     where i.id is null 

Второй SQL возвращает этот список -> Все непроданные товары

select 'product' as category, p.id as id, product_name as name
        from product p
        left join invoice_item ii on p.id = ii.product_id
        where ii.id is null;
...