2016-10-27 6 views
1

저는 SQL에 익숙하지 않아서 아마도 내 쿼리에 문제가있는 것 같습니다.하지만 내 문제는 아래 쿼리를 실행하여 내 테이블에 많은 중복이 생기는 것입니다.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의 동작 고유 행을 반환 할 때 UNION을 데이터 세트 경기의 모든 열입니다.

많은 컬럼에 대해 널 (null)이 지정되어있어 항상 다른 결과를 줄 수있는 두 개의 선택 사항이 있습니다.

아마도이 값을 두 데이터 집합으로 JOIN으로 다시 작성하면 원하는 결과를 얻을 수 있습니다.

아래에 가입하려는 각 cte에 하나의 행이 있다고 가정합니다.

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 참조를 인식하지 못하는 것 같습니다. SQL Server 2012 Express와 관련이 있다면 cte_Item 및 cte_Item을 사용해 보았습니다. cte_Assignemnt WITH 첫 번째 문에 AS를 추가해야했습니다. AS – Andy00001

+0

누락 된 'AS'항목을 업데이트했습니다. 나는 찾고 있지만 더 이상 문제를 볼 수 없습니다. ** 수정 **, 두 가지 오타가 발견되어 수정되었습니다. –

+0

ok cool - 나는 여전히 CTE를 사용하는 방법을 찾았지만 올바르지 않은 것 같지만 잘못된 개체 이름 'cte.Item'을 구문 어딘가에 넣을 수있다. – 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을 사용하고 한 쿼리에는 null이 있고 다른 쿼리에는 null 값이있는 경우 MAX를 사용합니다.

이 작업을 올바르게 수행하면 각 재고 번호에 대해 그룹화 된 단일 행이 생성됩니다. 보조 노트로

, 당신의 열 이름에 공백을 사용하여 명확 유지하려고, 오히려 도움을 _