2017-01-13 5 views
0

테이블 stock_transactionsstock_transactions_serials 인 재고 DB 디자인이 있습니다. 재고 트랜잭션 테이블은 창고에서 모든 IN 및 OUT 트랜잭션을 보유합니다. 각 트랜잭션은 함께가는 일련 번호 목록을 가질 수 있습니다.이 번호는 stock_transactions_serials에 기록되며 여기서 index는 stock_transaction_id + serial_id입니다.mysql inventory transactions - 위치에 일련 번호 목록 가져 오기

qty> 0 인 모든 위치에있는 일련 번호 목록을 나열하는 쿼리를 작성해야합니다. 여기서는 http://sqlfiddle.com/#!9/520bfa/5에서 작동 할 데이터가있는 SQL 피들을 빌드했습니다.

현재 내 SQL은 다음과 같이이다 :

SELECT 
    ST.id, 
    ST.warehouse_location_id, 
    ST.product_id, 
    SUM(ST.quantity) AS qty, 
    STS.serials AS serials 
FROM stock_transactions ST 
LEFT JOIN (
    SELECT stock_transaction_id, GROUP_CONCAT(serial_id) AS serials 
    FROM stock_transactions_serials 
    GROUP by stock_transaction_id 
) STS ON STS.stock_transaction_id = ST.id 
WHERE 
    ST.document_id = 9 
GROUP BY ST.warehouse_location_id 
HAVING qty > 0 

이 SQL에서 결과는 매우 옳지 않다. QTY는 맞지만 일련 번호가 잘못되었습니다 ...이 문서의 다른 주식 거래가 남았거나 그 위치에 들어간 일련 번호를 고려하지 않았습니다.

결과는 다음과 같아야합니다

위치 (51 개) 일련 번호 : 22229

위치 (52 개) 일련 번호 : 22221은 22222, 22223, 22224, 22225

업데이트 : 그냥 내 질문이 더 명확하게. 일련 번호가 A, B, C, D, E 인 컴퓨터를 위치 X에서 Y로 이동합니다. 이제 위치 Y에 일련 번호가있는 5 대의 랩톱이 있습니다. 다음으로 일련 번호 A가있는 위치 Y의 랩톱 하나를 위치 X로 다시 이동합니다. 그리고 위치 X에서 위치 Z까지 직렬 F를 가진 또 다른 랩탑 ... 모든 거래 후에 모든 위치에서 랩톱 수량을 알고 싶습니다. (0120) 일련 번호가없는 항목에 대해서도 솔루션을 제공합니다. 예를 들어 위치 A에서 위치 B까지 5 개의 USB 스틱을 이동 한 다음 B에서 C까지 2 개 그리고 마지막으로 A에서 C까지 2 개씩 이동합니다. 각 위치의 수량은 얼마입니까?

+1

일반적인 GROUP BY 규칙은 다음과 같이 말합니다. GROUP BY 절이 지정된 경우 SELECT 목록의 각 열 참조는 그룹화 열을 식별하거나 집합 함수의 인수 여야합니다! – jarlh

+0

@jarlh 귀하의 의견은 불행히도 많이 도움이되지 않습니다 –

+0

'It is not incalculating'로 시작하는 문장을 이해하지 못합니다. Pls는 질문을 명확히합니다. – Shadow

답변

1

각 자산의 현재 위치는 일련 번호에 영향을 미치는 마지막 in 트랜잭션 유형에서 파생 될 수 있습니다. 다음과 같은 쿼리를 사용하여 다음을 얻을 수 있습니다 : 당신이 자산이 이동 된 얻을 수있는 하위 쿼리로 위의 쿼리를 사용

select sts.serial_id, max(st.id) as max_in_id 
from stock_transactions st 
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id 
where st.type='In' 
group by sts.serial_id 

을에있는 창고뿐만 아니라, (개방 재고가없는 경우) 카운트 당신을 제공 .

select st.warehouse_location_id, 
     st.product_id, 
     count(sts.serial_id) as qty, 
     group_concat(sts.serial_id) as serials 
from stock_transactions st 
inner join stock_transactions_serials sts on sts.stock_transaction_id = st.id 
inner join (
    select sts2.serial_id, max(st2.id) as max_in_id 
    from stock_transactions st2 
    inner join stock_transactions_serials sts2 on sts2.stock_transaction_id = st2.id 
    where st2.type='In' 
    group by sts2.serial_id) as max_ins on st.id=max_ins.max_in_id and sts.serial_id=max_ins.serial_id 
group by st.warehouse_location_id, st.product_id 

위의 쿼리

stock_transaction_id, serial_id 필드에서 PK에 의해 암시 다른 제품에 대한 동일한 일련 ID를 가질 수 있다고 가정합니다.

+0

테스트 중입니다 ... –

+0

아직 테스트 할 시간이 없지만 일련 번호가없는 자료에도이 쿼리를 사용할 수 있습니까? 예를 들어, 위치 X에서 Y까지, Z에서 Y까지 3 등의 peaces가 있습니다. –

+0

아니요, 그 질문이 아니기 때문에 그렇습니다. – Shadow