2013-05-20 3 views
1

Я создаю запрос, который будет отображать прогнозируемый qty против qty, продаваемый на ежемесячной основе. Ниже приведены мои две таблицы, а третья - то, что я хочу в качестве вывода. Две таблицы почти одинаковы, за исключением того, что дата и дата создания находятся в другом формате (я преобразовал это в вывод, например, 201301, поэтому не стоит беспокоиться об этом). Как вы заметили в моей выходной таблице, qty продается в 25.00, потому что добавляет qty, если дата попадает под тот же месяц и год. Также нужно учитывать эти три важных условия:Объедините две таблицы, чтобы отобразить желаемый результат

  1. для отображения строки с прогнозируемым Qty, но без продаж
  2. Для отображения строк без проектируемой Qty, но с продаж
  3. (бывший пункт 206.) (Бывший пункт 312).
  4. для отображения строки с проекцией и продаж (напр. item001 & 040)

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

Таблица A (Sales Таблица)

item  code   Sold  date 
001  cust001  10.00  2013-01-20 
001  cust001  15.00  2013-01-25 
040  cust045  16.00  2013-04-07 
312  cust001  20.00  2013-03-13 

Таблица B (таблица Проекция)

item  Custcode ProjectedQty  Creation Date 
001  cust001  20.00    2013-01-01 
040  cust045  50.00    2013-04-01 
206  cust121  60.00    2013-04-01 

Выход

item  Custcode sold  Date   ProjectedQty   Creation Date 
001  cust001  25.00  201301   20.00     201301 
312  cust001  20.00  201303 null     null 
040  cust045 16.00  201304   50.00     201304 
206  cust121  null  null   60.00     201304 

Спасибо ребята за помощь.

ответ

1

Попробуйте

SELECT COALESCE(p.item, s.item) item, 
     COALESCE(p.code, s.code) code, 
     sold, 
     CONCAT(s.year, LPAD(s.month, 2, '0')) date, 
     ProjectedQty, 
     CONCAT(p.year, LPAD(p.month, 2, '0')) creationdate 
FROM 
(
    SELECT item, code, YEAR(`date`) year, MONTH(`date`) month 
    FROM sales 
    UNION 
    SELECT item, custcode, YEAR(`creationdate`), MONTH(`creationdate`) 
    FROM projection 
) i LEFT JOIN 
(
    SELECT item, code, SUM(sold) sold, YEAR(`date`) year, MONTH(`date`) month 
    FROM sales 
    GROUP BY item, code, YEAR(`date`), MONTH(`date`) 
) s ON i.item = s.item 
    AND i.code = s.code 
    AND i.year = s.year 
    AND i.month = s.month LEFT JOIN 
(
    SELECT item, custcode code, SUM(ProjectedQty) ProjectedQty, YEAR(`creationdate`) year, MONTH(`creationdate`) month 
    FROM projection 
    GROUP BY item, custcode, YEAR(`creationdate`), MONTH(`creationdate`) 
) p ON i.item = p.item 
    AND i.code = p.code 
    AND i.year = p.year 
    AND i.month = p.month 
ORDER BY code, item 

Выход:

| ITEM | CODE | SOLD | DATE | PROJECTEDQTY | CREATIONDATE | 
------------------------------------------------------------------ 
| 001 | cust001 |  25 | 201301 |   20 |  201301 | 
| 312 | cust001 |  20 | 201303 |  (null) |  (null) | 
| 040 | cust045 |  16 | 201304 |   50 |  201304 | 
| 206 | cust121 | (null) | (null) |   60 |  201304 | 

SQLFiddle

+0

Большое спасибо за помощь сэр .. он работает !! – user1840952

+0

@ user1840952 Добро пожаловать. Рад, что это помогло :) – peterm

+0

Я закончил с моим отчетом, безболезненно :) – user1840952

1

Почему бы не просто использовать ?

SELECT * FROM `sales`, `projection` WHERE `code`=`custcode`; 

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

+0

Извините, я не понял? – user1840952

0

Создать представление, используя union. а затем вы можете использовать приведенный ниже запрос:

select *, sum(sold) as sold from view group by item 

другое:

select *, sum(sold) from (
select item,  code as Custcode, sold,  date,   'ProjectedQty' as ProjectedQty,   'Creation Date' as Creation Date from table 1 union select item,  Custcode, sold,  Date,   ProjectedQty,   Creation Date, from table 2) group by item 
Смежные вопросы