2017-12-20 3 views
0

일반적인 주문 헤더 및 주문 라인 테이블을 보유하고 있습니다. 이 단순화 된 DDL이다 (이 이상의 필드가 있지만이 질문에 중요하지 않음)제품 별 최종 거래 얻기

CREATE TABLE [dbo].[OrderHeader](
    [id] [nvarchar](50) NOT NULL, 
    [voucherDate] [datetime] NOT NULL, 
    [voucherNumber] [bigint] NOT NULL, 
    [voucherType] [nvarchar](50) NOT NULL, 
    [account] [nvarchar](50) NULL, 
    [po] [nvarchar](50) NULL, 
    [total] [decimal](19, 3) NOT NULL, 
    [status] [tinyint] NOT NULL, 
    [discount] [decimal](19, 3) NOT NULL, 
    [rounding] [decimal](19, 3) NULL, 
    [net] [decimal](19, 3) NOT NULL, 
    [warehouse] [nvarchar](50) NULL, 
CONSTRAINT [PK_OrderHeader] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE TABLE [dbo].[OrderLine](
    [header] [nvarchar](50) NOT NULL, 
    [line] [int] NOT NULL, 
    [item] [nvarchar](50) NULL, 
    [quantity] [decimal](19, 3) NOT NULL, 
    [price] [decimal](19, 3) NOT NULL, 
    [discount] [decimal](19, 3) NOT NULL, 
    [total] [decimal](19, 3) NOT NULL, 
CONSTRAINT [PK_OrderLine] PRIMARY KEY CLUSTERED 
(
    [header] ASC, 
    [line] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

I, 그것은 각 창고에 반환하는 경우 SQL 서버에서 쿼리를 실행하는 항목 당 마지막 주문 라인이 필요합니다.

그렇게

warehouse 1 
     item1, Order20, line 3 
     item2, Order 40, line 1 

    warehouse 2 
     item1, Order25, line 1 

등 ... 같은웨어 하우스의

여러 개의 주문이 동일한 항목에 대해 동일한 날짜에 존재할 수는,이 경우에는 최신 순서해야합니다. 나는 orderDate에 대해 DateTime을 사용하지 않고 있으며 단지 날짜 일뿐입니다.

쉬운 방법이 있나요?

+1

아직 검색어를 작성하려 했습니까? 나는 SO에서 정말로 기대되기 때문에뿐만 아니라 당신에게 대답을 얻는 것이 더 쉽기 때문에 이것을 묻습니다. –

+0

테이블에 _columns_가 있지만 필드는 없습니다. – jarlh

답변

0

사용 가능한 샘플 데이터 또는 DDL이 없으면 이는 추측입니다. 작동하지 않는 경우 게시물을 수정하고이 답변에 회신하십시오.

WITH CTE AS (
    SELECT OH.Warehouse, 
      OL.Item, 
      OH.OrderNbr, 
      OH.LineNbr, 
      ROW_NUMBER() OVER (PARTITION BY OH.Warehouse, OL.LineNbr ORDER BY OrderDate) AS RN 
    FROM OrderHeader OH 
     JOIN OrderLine OL ON OH.OrderNbr = OL.OrderHbr) 
SELECT Warehouse, 
     Item, 
     OrderNbr, 
     LineNbr 
FROM CTE 
WHERE RN = 1; 

같은 날에 최신 주문이 무엇인지 결정하는 방법을 정의하지 않았으므로 고려하지 않았습니다. 문제가있는 경우 데이터를 올바르게 작동 시키려면 ORDER BY을 수정해야합니다 (또는 다시 게시글을 수정하십시오).

+0

빠른 답장을 보내 주셔서 감사합니다. 테이블의 DDL을 추가했습니다. 나는 최신 주문이 무엇인지 말할 것 같아요, 나는 바우처 날짜와 바우처 번호로 가야합니다. – daoud175

+0

@ daoud175 그 DDL에 대한 샘플 데이터와 예상 결과가 없으면 더 이상 알려주지 않습니다. 내가 제공 한 것을 시도 했니? 앞에서 말했듯이,'ORDER BY'에 조금 더 추가 할 필요가있을 것입니다. 그러나 이것이 당신을 올바른 길로 인도한다고 상상합니다. – Larnu

+0

예. 동일한 상품/창고 조합이 여러 번 표시됩니다. max (orderDate)가 발생하지 않아야합니까? – daoud175