2014-02-17 2 views
0

나는 나에게 복잡한 것처럼 보이는 것에 도움이 필요하다.여러 SQL 쿼리 또는 커서?

테이블 및 창고 테이블의 데카르트 제품 인 tbl1을 만들기 위해 쿼리를 만들었습니다. 그것은 모든 창고에 다시의 날 모든 항목을 제공 :

SELECT i.ItemID, w.WarehouseID 
FROM Item i, Warehouse w 

은 내가 이전 또는 그 수량 규칙 인 변수 일 (@datevar)와 동일 마지막 문서의 날짜를 확인 두 번째 쿼리 (TBL2)를 만들어

  1. 이 항목 창고 당 포함하는 세 번째 테이블을 구축 : 1 (PhysicalQtyRule = 1),이 항목 및 창고로,

    SELECT MAX(CreateDate) AS [DATE1], ItemID, Quantity, WarehouseID 
    FROM StockHistory 
    WHERE PhysicalQtyRule = 1 AND CreateDate <= @datevar 
    GROUP BY ItemID, Quantity, WarehouseID 
    

    이제 StockHistory 테이블에서 얻은, 좀 더 세 단계가 필요합니다 수량의 합계이지만 수량 규칙은 2 (PhysicalQtyRule = 2)이고 tbl2.date (존재하는 경우)와 날짜 @Datevar의 날짜는 StockHistory 테이블에서 가져옵니다. 비슷해 :

    SELECT ItemID, WarehouseID, SUM(Quantity) 
    FROM StockHistory 
    WHERE PhysicalQtyRule = 2 AND CreateDate > tbl2.DATE1 --If exists 
    AND CreateDate <= @datevar 
    GROUP BY ItemID, WarehouseID 
    
  2. 아이템 창고 당 양의 합을 포함하는 네 번째 테이블을 구축하지만, 양 규칙 3 (PhysicalQtyRule = 3) tbl2.date 사이의 날짜 (있는 경우) 및 날짜 StockHistory 테이블에서 가져온 @datevar 변수의 값. 뭐 그런 : 필요 커서 경우 나도 몰라

    SELECT i.ItemID, w.WarehouseID, tbl2.Quantity + tbl3.Quantity – tbl4.Quantity AS [Qty] 
    FROM Item i, Warehouse w 
    

:

SELECT ItemID, WarehouseID, SUM(Quantity) 
FROM StockHistory 
WHERE PhysicalQtyRule = 3 AND CreateDate > tbl2.DATE1 --If exists 
AND CreateDate <= @datevar 
GROUP BY ItemID, WarehouseID 
  • 는 합계 수량 열이있는, 그런 일을 첫 번째에 따라 최종 테이블을 만듭니다 (저에게 새로운 것) 또는 여러 번의 쿼리가 있지만 StockHistory 테이블에 수백만 개의 레코드가 있으므로 최상의 성능이 중요합니다.

    아무도 도와 줄 수 있습니까? 고맙습니다! 하나 개의 항목 만 한웨어 하우스

    일부 샘플 데이터는 :

    +--------+-------------+------------+-----------------+----------+ 
    | ItemID | WarehouseID | CreateDate | PhysicalQtyRule | Quantity | Balance | comments 
    +--------+-------------+------------+-----------------+----------+ 
    | 1234 |   11 | 2013-03-25 |    2 |  35 |  35 | Rule 2 = In 
    | 1234 |   11 | 2013-03-28 |    3 |  30 |  5 | Rule 3 = Out 
    | 1234 |   11 | 2013-04-01 |    1 |  3 |  3 | Rule 1 = Reset 
    | 1234 |   11 | 2013-07-12 |    2 |  40 |  43 | Rule 2 = In 
    | 1234 |   11 | 2013-09-05 |    3 |  20 |  23 | Rule 3 = Out 
    | 1234 |   11 | 2013-12-31 |    1 |  25 |  25 | Rule 1 = Reset 
    | 1234 |   11 | 2014-01-09 |    3 |  11 |  14 | Rule 3 = Out 
    | 1234 |   11 | 2014-01-16 |    3 |  6 |  8 | Rule 3 = Out 
    

    나는 어떤 변수 날짜에 균형을 알고 싶어요.

  • +0

    이 테이블 생성 결과로 최종 쿼리를 얻으려고하거나 모든 데이터를 적극적으로 저장해야합니까? – TTeeple

    +0

    마지막 쿼리 만 필요합니다. 가장 좋은 설명을 시도하기 위해이 모든 조치를 취하십시오. – PJLG

    +1

    몇 가지 샘플 데이터와 예상 결과를 제공해 주시겠습니까? – TTeeple

    답변

    0

    데이터가 없으면이를 테스트 할 수 없지만 이것이 솔루션이어야한다고 생각합니다.

    SELECT i.ItemID 
        ,w.WarehouseID 
        ,[Qty] = tbl2.Quantity + tbl3.Quantity – tbl4.Quantity 
    FROM Item i 
    CROSS JOIN Warehouse w 
    OUTER APPLY (
    SELECT [DATE1] = MAX(sh.CreateDate) 
         ,sh.ItemID 
         ,sh.Quantity 
         ,sh.WarehouseID 
    FROM StockHistory sh 
    WHERE sh.PhysicalQtyRule = 1 AND sh.CreateDate <= @datevar 
    AND i.ItemID = sh.ItemID 
        AND w.WarehouseID = sh.WarehouseID 
    GROUP BY sh.ItemID, sh.Quantity, sh.WarehouseID) tbl2 
    OUTER APPLY (
    SELECT sh.ItemID 
        ,sh.WarehouseID 
        ,[Quantity] = SUM(sh.Quantity) 
    FROM StockHistory sh 
    WHERE sh.PhysicalQtyRule = 2 AND sh.CreateDate > tbl2.DATE1 --If exists 
    AND sh.CreateDate <= @datevar AND i.ItemID = sh.ItemID 
    AND w.WarehouseID = sh.WarehouseID 
    GROUP BY sh.ItemID, sh.WarehouseID) tbl3 
    OUTER APPLY (
    SELECT sh.ItemID 
        ,sh.WarehouseID 
        ,[Quantity] = SUM(sh.Quantity) 
    FROM StockHistory sh 
    WHERE sh.PhysicalQtyRule = 3 AND sh.CreateDate > tbl2.DATE1 --If exists 
    AND sh.CreateDate <= @datevar AND i.ItemID = sh.ItemID 
        AND w.WarehouseID = sh.WarehouseID 
    GROUP BY sh.ItemID, sh.WarehouseID) tbl4 
    
    +0

    왜 그런지는 모르겠지만 쿼리는 tbl2.DATE1 ("존재한다면"근처)과 별칭 tbl3과 tbl4 ... – PJLG

    +0

    그리고웨어 하우스 테이블에는 ItemID 필드가 없습니다. 모든 항목 x 모든 창고를 원하기 때문에 첫 번째 쿼리가 "완벽"했습니다 (생각합니다).하지만이 쿼리에서도 얻을 수 있습니다 : 'SELECT ItemID, WarehouseID FROM StockHistory GROUP BY ItemID, WarehouseID' – PJLG

    +0

    @PJLG 'CROSS JOIN'을위한'ON' 절. 쿼리와 동일한 실행 계획입니다. 좀 더 읽기 쉬운 IMO입니다. 다른 문제를 계속 조사 중입니다. – TTeeple