2016-11-08 5 views
4

SQL Server 2008 로의 변환에 도움을 찾고 있습니다. 크로스 어플 리케이션과 내부 조인을 시도했는데 (아무렇지도 않았다는 말은하지 않았다.) 아무 소용이 없다 ... 어떤 제안?SQL Server 2008 버전 OVER (... 행 제한이 없습니다.)

본질적으로하는 일은 주식 표와 주문표가 있습니다. 그러나 2012+ I SQL 서버 인에 의해 두 결합은 주식이 날라되면 순서에 따라 이제

WITH ADVPICK 
    AS (SELECT 'A'     AS PlaceA, 
       placeb, 
       CASE 
        WHEN picktime = '00:00' THEN '07:00' 
        ELSE ISNULL(picktime, '12:00') 
       END     AS picktime, 
       Cast(product AS INT) AS product, 
       prd_description, 
       -qty     AS Qty 
     FROM t_pick_orders 
     UNION ALL 
     SELECT 'A'    AS PlaceA, 
       placeb, 
       '0', 
       Cast(code AS INT) AS product, 
       NULL, 
       stock 
     FROM t_pick_stock), 
    STOCK_POST_ORDER 
    AS (SELECT *, 
       Sum(qty) 
        OVER (
        PARTITION BY placeb, product 
        ORDER BY picktime ROWS UNBOUNDED PRECEDING) AS new_qty 
     FROM ADVPICK) 
SELECT *, 
     CASE 
     WHEN new_qty > qty THEN new_qty 
     ELSE qty 
     END AS order_shortfall 
FROM STOCK_POST_ORDER 
WHERE new_qty < 0 
ORDER BY placeb, 
      picktime, 
      product 

파티션을 통해 전체 합계 (자세한 내용은 More Details 내 이전 질문 참조) 무엇을 선택하는 나를 보여 이 CROSS APPLY에 상관 하위 쿼리를 사용하는 것입니다 할

+--------+--------+----------+---------+-----------+-------+---------+-----------------+ 
| PlaceA | PlaceB | Picktime | product | Prd_Descr | qty | new_qty | order_shortfall | 
+--------+--------+----------+---------+-----------+-------+---------+-----------------+ 
| BW  | AMES | 16:00 | 1356 | Product A | -1330 |  -17 |    -17 | 
| BW  | AMES | 16:00 |  17 | Product B | -48 |  -42 |    -42 | 
| BW  | AMES | 17:00 | 1356 | Product A | -840 | -857 |   -840 | 
| BW  | AMES | 18:00 | 1356 | Product A | -770 | -1627 |   -770 | 
| BW  | AMES | 18:00 |  17 | Product B | -528 | -570 |   -528 | 
| BW  | AMES | 19:00 | 1356 | Product A | -700 | -2327 |   -700 | 
| BW  | AMES | 20:00 | 1356 | Product A | -910 | -3237 |   -910 | 
| BW  | AMES | 20:00 | 8009 | Product C | -192 |  -52 |    -52 | 
| BW  | AMES | 20:00 |  897 | Product D | -90 |  -10 |    -10 | 
+--------+--------+----------+---------+-----------+-------+---------+-----------------+ 
+0

샘플 데이터, 원하는 결과 및 코드가 수행하는 것에 대한 설명이 도움이 될 것입니다. –

+0

질문을 읽어보십시오. 자세한 내용은 –

+1

에서 더 이상 제공되지 않습니다. SQL Server 2008 R2는 더 이상 지원되지 않습니다. 아마도 서버 업그레이드를 고려해야합니까? –

답변

4

한 솔직 방법 : 2008 실행하고 그래서 변환해야 할 두 서버 ...

예상 결과가 있습니다.

테이블이 다소 크다면, 다음 질문은 그것을 빨리 만드는 것입니다. PlaceB, Product, PickTime INCLUDE (Qty)의 색인이 도움이 될 것입니다. 그러나 테이블이 너무 큰 경우 커서가 더 좋을 것입니다.

WITH 
ADVPICK 
AS 
(
    SELECT 'A' as PlaceA,PlaceB, case when PickTime = '00:00' then '07:00' else isnull(picktime,'12:00') end as picktime, cast(Product as int) as product, Prd_Description, -Qty AS Qty FROM t_pick_orders 
    UNION ALL 
    SELECT 'A' as PlaceA,PlaceB, '0', cast(Code as int) as product, NULL, Stock FROM t_pick_stock 
) 
,stock_post_order 
AS 
(
    SELECT 
     * 
    FROM 
     ADVPICK AS Main 
     CROSS APPLY 
     (
      SELECT SUM(Sub.Qty) AS new_qty 
      FROM ADVPICK AS Sub 
      WHERE 
       Sub.PlaceB = Main.PlaceB 
       AND Sub.Product = Main.Product 
       AND T.PickTime <= Main.PickTime 
     ) AS A 
) 
SELECT 
    *, 
    CASE WHEN new_qty > qty THEN new_qty ELSE qty END AS order_shortfall 
FROM 
    stock_post_order 
WHERE 
    new_qty < 0 
ORDER BY PlaceB, picktime, product; 

아, 그리고 (PlaceB, Product, PickTime)이 고유하지 않으면, 당신은 SUM() OVER와 함께 원래의 질의에 대한 다소 다른 결과를 얻을 수 있습니다. 똑같은 결과가 필요하다면, 연계를 해결하기 위해 여분의 열 (예 : ID)을 사용해야합니다.

+0

감사합니다 블라디미르, 전이 접근법을 시도하고 빈 결과가 발생하지만 그때 당신 Picktime 고유 한 아니에요 (나는 결과 테이블의 발췌 문장을 게시 할거야) –

+0

빈 결과의 원인은 mistype, 답변은 완벽하게 작동합니다. –

+1

@LRiley, 실제로 중요한 것은'(PlaceB, Product, PickTime) '의 조합이 유일한 경우입니다. 나는 그것이 당신을 위해 일해서 다행입니다. –