2014-03-26 3 views
0

제품 주문이 포함 된 SQL Server 2008 R2에 테이블이 있습니다. 대부분의 경우,이 제품SQL Server 재사용 쿼리

나는 테이블 식을 사용하여 쿼리를 작성했습니다이

ID | Prod | Qty 
------------------ 
1 | A | 1 
4 | B | 1 
9 | A | 3 
12 | C | 1 
16 | A | 2 
21 | B | 1 

처럼 보이는 테이블을 기반으로 뷰를 생성 할

ID | Prod | Qty 
------------ 
1 | A | 1 
4 | B | 1 
7 | A | 1 
8 | A | 1 
9 | A | 1 
12 | C | 1 
15 | A | 1 
16 | A | 1 
21 | B | 1 

당 하나 개의 항목입니다 그러나 나는 그것이 작동하게 만드는 방법에 난처하게된다. 아래의 SQL은 실제로 작동하지 않지만 내가하려고하는 것의 샘플입니다. 이 쿼리는 여러 가지 방법으로 작성했지만 올바른 결과를 얻는 방법을 파악할 수는 없습니다. 순차적 인 ID를 생성하기 위해 row_number를 사용하고 있습니다. 그런 다음 ReleaseId가 순차적이지만 꼭 연속적 일 필요는 없으므로 다음 행에 이전 행과 동일한 제품이 있는지 연속 행을 비교하고 비교할 수 있습니다. 어떤 도움을 주셔서 감사합니다.

;with myData AS 
(
    SELECT 
    row_number() over (order by a.ReleaseId) as 'Item', 
    a.ReleaseId, 
    a.ProductId, 
    a.Qty 
    FROM OrdersReleased a 

    UNION ALL 

    SELECT 
    row_number() over (order by b.ReleaseId) as 'Item', 
    b.ReleaseId, 
    b.ProductId, 
    b.Qty 
    FROM OrdersReleased b 
    INNER JOIN myData c ON b.Item = c.Item + 1 and b.ProductId = c.ProductId       
) 
SELECT * from myData 
+0

대안으로, I는 다음과 같이 그것을 writting 시도; AS MYDATA ( 와 '항목' ord.ReleaseId, \t ORD 같은 ord.ReleaseId하여 (순서)를 통해 ROW_NUMBER()를 선택 \t \t FROM .ProductId, ord.Qty 가 '릴리즈' \t c.ProductId 로 맥스 (c.ReleaseId을 선택 ORD ))를 OrdersReleased, 합 (c 같은 .Qty) '수량' \t \t MYDATA C를 FROM LEFT d.Item가 ON MYDATA d를 가입 c.Item = + 1 = d.productid c.productid c.item, c.releaseid, C로 기. productid, c.qty 주문 : c.ReleaseId –

답변

0

일반적으로 ID는 요약이므로 드롭합니다.

SELECT a.ProductId, 
    SUM(a.Qty) AS Qty 
    FROM OrdersReleased a 
    GROUP BY a.ProductId 
    ORDER BY a.ProductId 

- 하위 쿼리를 수행하려는 경우 매우 큰 데이터 세트가없는 경우 열로 처리 할 수 ​​있습니다.

SELECT a.ProductId, 
     SUM(a.Qty) AS Qty, 
     (SELECT COUNT(1) 
      FROM OrdersReleased b 
      WHERE b.ReleasedID - 1 = a.ReleasedID 
      AND b.ProductId = b.ProductId) as NumberBackToBack 
    FROM OrdersReleased a 
    GROUP BY a.ProductId 
    ORDER BY a.ProductId 
+0

잘 모르겠습니다. Row_number()와 ProductId는 레코드 간의 관계를 설정합니다. 마지막 SELECT에서 삭제할 수 있지만 동의하지 않는 쿼리를 만드는 방법에 대해서는 동의하지 않습니다. –

+0

이름에 맞게 SQL을 변경하십시오. 3 열은 row_number()에 대한 필요성을 제거하지 않습니까? – JBrooks

+0

ReleaseId가 반드시 연속적 일 필요는 없으므로 b.Id - 1 = a.ID가 항상 true가 아니므로 row_number()를 추가해야합니다. –