2016-10-27 6 views
1

Я новичок в SQL, поэтому, вероятно, поэтому возникает проблема с моим запросом, но моя проблема заключается в том, что я запускаю приведенный ниже запрос и получаю много дубликатов на моей таблице.Duplicates in Union

Обе таблицы имеют список предметов с одинаковыми номерами акций, поэтому я присоединяюсь к номеру акций. Проблема в том, что я получаю дублирование в своем списке, тот же номер акций, но у одной строки есть оборот и дни на аренду, а другая - на оставшуюся часть информации из второго выбора минус оборота и дней аренды.

Любая помощь будет оценена!


(SELECT NULL       AS 'ITEM_ID', 
     stock_items.stock_number  AS 'STOCK NUMBER', 
     SUM(stock_assign.turnover)  AS 'TURNOVER', 
     SUM(stock_assign.days_on_hire) AS 'DAYS ON HIRE', 
     NULL       AS ' CAT', 
     NULL       AS 'ITEM NAME', 
     NULL       AS 'DEPOT LOC', 
     NULL       AS 'DISPOSAL DATE', 
     NULL       AS 'DISPOSAL TYPE', 
     NULL       AS 'DATE CREATED', 
     NULL       AS 'CREATED BY', 
     NULL       AS 'COST PRICE' 
FROM stock_assign 
     left join stock_items 
       ON stock_assign.stock_number = stock_items.stock_number 
     left join depots 
       ON depot_id = depots.dpt_id 
GROUP BY stock_items.stock_number, 
      depots.dpt_name) 
UNION 
(SELECT stock_items.item_id   AS 'ITEM_ID', 
     stock_items.stock_number AS 'STOCK NUMBER', 
     NULL      AS 'TURNOVER', 
     NULL      AS 'DAYS ON HIRE', 
     stock_items.equipment_class AS ' CAT', 
     stock_items.name   AS 'ITEM NAME', 
     depots.dpt_name    AS 'DEPOT LOC', 
     stock_items.disposal_date AS 'DISPOSAL DATE', 
     stock_items.disposal_type AS 'DISPOSAL TYPE', 
     stock_items.date_available AS 'DATE CREATED', 
     users.usr_name    AS 'CREATED BY', 
     fixed_assets.cost_amount AS 'COST PRICE' 
FROM stock_items 
     left join users 
       ON users.usr_id = stock_items.userid_created 
     left join depots 
       ON stock_items.depot_id_located_at = depots.dpt_id 
     left join fixed_assets 
       ON stock_items.item_id = fixed_assets.stock_item_id) 
ORDER BY 'STOCK NUMBER' ASC 

ответ

1

Поведение UNION является возвращение уникальных строк, когда каждый столбец в unioned матче наборов данных.

У вас есть два выбора, которые, по-видимому, всегда будут давать разные результаты из-за нулей, назначенных для многих столбцов.

Возможно, если вы переиздаете это как JOIN двух наборов данных, вы получите результат, который вы хотите.

Предполагая, что у вас есть одна строка на каждом ците, который вы хотите присоединиться ниже, является примером;

WITH cte_Assignment AS 
(
    SELECT 
     stock_items.stock_number  AS 'STOCK NUMBER', 
     SUM(stock_assign.turnover)  AS 'TURNOVER', 
     SUM(stock_assign.days_on_hire) AS 'DAYS ON HIRE' 
    FROM stock_assign 
    LEFT JOIN stock_items 
     ON stock_assign.stock_number = stock_items.stock_number 
    LEFT JOIN depots 
     ON depot_id = depots.dpt_id 
    GROUP BY 
     stock_items.stock_number 
) 

, cte_Item AS 
(
    SELECT 
     stock_items.item_id   AS 'ITEM_ID', 
     stock_items.stock_number AS 'STOCK NUMBER', 
     stock_items.equipment_class AS ' CAT', 
     stock_items.name   AS 'ITEM NAME', 
     depots.dpt_name    AS 'DEPOT LOC', 
     stock_items.disposal_date AS 'DISPOSAL DATE', 
     stock_items.disposal_type AS 'DISPOSAL TYPE', 
     stock_items.date_available AS 'DATE CREATED', 
     users.usr_name    AS 'CREATED BY', 
     fixed_assets.cost_amount AS 'COST PRICE' 
    FROM stock_items 
    LEFT JOIN users 
     ON users.usr_id = stock_items.userid_created 
    LEFT JOIN depots 
     ON stock_items.depot_id_located_at = depots.dpt_id 
    LEFT JOIN fixed_assets 
     ON stock_items.item_id = fixed_assets.stock_item_id 
) 

SELECT 
    item.[ITEM_ID], 
    item.[STOCK NUMBER], 
    assignment.[TURNOVER], 
    assignment.[DAYS ON HIRE], 
    item.[ CAT], 
    item.[ITEM NAME], 
    item.[DEPOT LOC], 
    item.[DISPOSAL DATE], 
    item.[DISPOSAL TYPE], 
    item.[DATE CREATED], 
    item.[CREATED BY], 
    item.[COST PRICE] 
FROM cte_Assignment assignment 
INNER JOIN cte_Item item 
    on item.[STOCK NUMBER] = assignment.[STOCK NUMBER] 

ORDER BY item.[STOCK NUMBER] ASC 
+1

Спасибо за вашу помощь - это похоже на то, что мне нужно, но у меня возникли проблемы с получением его узнайте поля в cte_Item, он, похоже, не распознает ссылку CTE, хотя это относится к назначениям. Я пробовал, cte_Item и, cte_Item AS, я использую SQL Server 2012 Express, если это имеет какое-либо отношение к нему? Стоит отметить, что мне пришлось добавить AS в первый оператор WITH cte_Assignemnt AS – Andy00001

+0

Я обновил отсутствующие записи 'AS'. Я смотрю, но пока не вижу еще одной проблемы. ** Исправление **, найдено два опечатка и исправлено. –

+0

ok cool - я все еще получаю недопустимое имя объекта 'cte.Item', может быть, просто что-то с синтаксисом где-то, хотя я искал, как использовать CTE, и это кажется правильным – Andy00001

0

Другой вариант, который у вас есть, - это обернуть запрос, который у вас есть в качестве подзапроса.

SELECT MAX(ITEM_ID) as ITEM_ID, SUM(TURNOVER) 
FROM 
(SELECT NULL       AS 'ITEM_ID', 
    stock_items.stock_number  AS 'STOCK NUMBER', 
    SUM(stock_assign.turnover)  AS 'TURNOVER', 
    SUM(stock_assign.days_on_hire) AS 'DAYS ON HIRE', 
    NULL       AS ' CAT', 
    NULL       AS 'ITEM NAME', 
    NULL       AS 'DEPOT LOC', 
    NULL       AS 'DISPOSAL DATE', 
    NULL       AS 'DISPOSAL TYPE', 
    NULL       AS 'DATE CREATED', 
    NULL       AS 'CREATED BY', 
    NULL       AS 'COST PRICE' 
FROM stock_assign 
    left join stock_items 
      ON stock_assign.stock_number = stock_items.stock_number 
    left join depots 
      ON depot_id = depots.dpt_id 
GROUP BY stock_items.stock_number, 
     depots.dpt_name) 
UNION 
(SELECT stock_items.item_id   AS 'ITEM_ID', 
    stock_items.stock_number AS 'STOCK NUMBER', 
    NULL      AS 'TURNOVER', 
    NULL      AS 'DAYS ON HIRE', 
    stock_items.equipment_class AS ' CAT', 
    stock_items.name   AS 'ITEM NAME', 
    depots.dpt_name    AS 'DEPOT LOC', 
    stock_items.disposal_date AS 'DISPOSAL DATE', 
    stock_items.disposal_type AS 'DISPOSAL TYPE', 
    stock_items.date_available AS 'DATE CREATED', 
    users.usr_name    AS 'CREATED BY', 
    fixed_assets.cost_amount AS 'COST PRICE' 
FROM stock_items 
    left join users 
      ON users.usr_id = stock_items.userid_created 
    left join depots 
      ON stock_items.depot_id_located_at = depots.dpt_id 
    left join fixed_assets 
      ON stock_items.item_id = fixed_assets.stock_item_id) 
ORDER BY 'STOCK NUMBER' ASC) a 
GROUP BY a.[Stock Number] 

Тогда вам нужно было бы группировать все аналогичные столбцы в 2 запросах, т. Е. Инвентарный номер. Если у вас есть десятичные значения в обоих запросах, используйте SUM, и если у вас есть нуль в одном запросе, а значение в другом - MAX.

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

В качестве примечания, старается держаться подальше от использования пространства в именах столбцов, а заменить его с _