SQL: использование UNION - PullRequest
       18

SQL: использование UNION

0 голосов
/ 17 марта 2012

Вот вопрос и информация о базе данных.

Используйте команду UNION для подготовки полной выписки для клиента «C001» - она ​​должна быть изложена следующим образом. (Обратите внимание, что приведенные ниже значения неверны.) Вы можете использовать '' или NULL для пустых значений - при необходимости используйте 0. enter image description here

Вот ссылка на веб-страницу с информацией о базе данных. http://sqlzoo.net/5_0.htm или см. Изображение ниже. enter image description here

Вот что я пробовал:

    SELECT sdate AS LineDate, "delivery" AS LEGEND, price*quantity AS Total,"" AS Amount
    FROM shipped
    JOIN product ON (shipped.product=product.id)
    WHERE badguy='C001'
    UNION
    SELECT rdate,notes, "",receipt.amount
    FROM receipt
    WHERE badguy='C001'

Вот что я получаю обратно:

Неправильный ответ. Правильный ответ имеет 5 строк.

enter image description here

В столбце суммы суммы кажутся неправильными, и я не могу понять, как упорядочить данные по дате, поскольку используются два разных столбца даты (sdate и rdate, которые являются UNIONED).

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Похоже, что данные в примере агрегируются по дате и типу сбора с использованием group by, поэтому вы получаете слишком много строк.Кроме того, вы можете сортировать по псевдониму столбца (LineDate), и предложение order by будет применяться ко всем строкам в union.

  SELECT sdate AS LineDate, "delivery" AS LEGEND, SUM(price*quantity) AS Total,"" AS Amount
    FROM shipped
    JOIN product ON (shipped.product=product.id)
    WHERE badguy='C001'
    GROUP BY sdate
    UNION
    SELECT rdate, notes, "",receipt.amount
    FROM receipt
    WHERE badguy='C001'
  ORDER BY LineDate
.
0 голосов
/ 17 марта 2012

Обычно проще всего разработать каждую часть союза в отдельности.Обратите внимание на использование «нуля» для разделения денежных столбцов.Первый выбор получает имя столбцов.

select s.sdate as tr_date, 'Delivery' as type, sum((s.quantity * p.price)) as extended_price, null as amount
  from shipped s
  inner join product p on p.id = s.product
  where badguy = 'C001'
  group by s.sdate
union all
select rdate, notes, null, sum(amount)
  from receipt
  where badguy = 'C001'
  group by rdate, notes
order by tr_date
...