2

SQL Server 2008 R2Microsoft Dynamics AX ERPデータベースにテーブルがあり、いくつかの行があり、テーブルに qty という名前のフィールドがあり、いくつかの行には負の数量があり、いくつかの行には正の数量があります。別のフィールド TransactionID があります。ここで、負の数量を持つすべての TransactionID と、正の QTy と負の数量を持ついくつかの行を持つ TransactionID も選択したいと考えています。

TransactionID は、マスター テーブルの外部キー フィールドです。

これまでのところ、動作しないコードの下に書きました。

select * from RBOTRANSACTIONSALESTRANS main where main.qty < 0 
                                               and main.DATAAREAID = 'DAT'
and exists 
(
select 1 from RBOTRANSACTIONSALESTRANS where QTY > 0 
and RBOTRANSACTIONSALESTRANS.DATAAREAID = main.DATAAREAID
and RBOTRANSACTIONSALESTRANS.STORE = main.STORE 
and RBOTRANSACTIONSALESTRANS.TERMINALID = main.TERMINALID 
)

order by main.TRANSACTIONID
4

4 に答える 4

2

要約すると、負の数量を持つ同じ TransactionID を持つ行が少なくとも 1 つ存在するすべての行を選択したいですか?

select * 
from RBOTRANSACTIONSALESTRANS main 
where main.DATAAREAID = 'DAT'
 and exists 
  (
    select 1 
    from RBOTRANSACTIONSALESTRANS sub 
    where sub.QTY < 0 
      and sub.DATAAREAID = main.DATAAREAID
      and sub.STORE = main.STORE 
      and sub.TERMINALID = main.TERMINALID
      and sub.TRANSACTIONID = main.TRANSACTIONID
  )
order by main.TRANSACTIONID

主な違いは、main.QTY < 0小切手があったことです。そして、私は追加しましsub.TRANSACTIONID = main.TRANSACTIONIDた。

于 2013-01-10T10:55:40.503 に答える
1

多かれ少なかれクエリはそのようなものでなければなりません

select * from 
(
select tansactionID, sum(qty) as q, sum(abs(qty)) as q2
from table2 T
group by tansactionID ) T
where q<> q2

スキーマを投稿して調整できるようにします

于 2013-01-10T10:56:01.690 に答える
1

あなたは問題を複雑にしすぎているように私には思えます。基準を正しく理解している場合は、すべての行が必要です。

  • 数量は<0です

また

  • 数量が0未満で、同じトランザクションIDの行が負の数量で存在している

だから始める

SELECT  *
FROM    RBOTRANSACTIONSALESTRANS tr
WHERE   tr.DATAAREAID = 'DAT'
AND     tr.Qty < 0

最初の基準を満たします。次は2番目を行います。

SELECT  *
FROM    RBOTRANSACTIONSALESTRANS tr
WHERE   tr.DATAAREAID = 'DAT'
AND     tr.Qty > 0
AND     EXISTS
        (   SELECT  1
            FROM    RBOTRANSACTIONSALESTRANS neg
            WHERE   neg.TransactionID = tr.TransactionID
            AND     neg.DATAAREAID = 'DAT'
            AND     neg.Quantity < 0
        )

これは次のように組み合わせることができます

SELECT  *
FROM    RBOTRANSACTIONSALESTRANS tr
WHERE   tr.DATAAREAID = 'DAT'
AND (   tr.Qty < 0
    OR  EXISTS
        (   SELECT  1
            FROM    RBOTRANSACTIONSALESTRANS neg
            WHERE   neg.TransactionID = tr.TransactionID
            AND     neg.DATAAREAID = 'DAT'
            AND     neg.Quantity < 0
        )
    )

ただし、最初の句は冗長です。これは、数量が存在< 0するすべての行も句によって満たされるためEXISTSです。したがって、これは次のように簡略化できます。

SELECT  *
FROM    RBOTRANSACTIONSALESTRANS tr
WHERE   tr.DATAAREAID = 'DAT'
AND     EXISTS
        (   SELECT  1
            FROM    RBOTRANSACTIONSALESTRANS neg
            WHERE   neg.TransactionID = tr.TransactionID
            AND     neg.DATAAREAID = 'DAT'
            AND     neg.Quantity < 0
        )
于 2013-01-10T11:23:37.720 に答える
1

JOINedクエリはTRANSACTIONID、条件に従って定義します(条件を参照HAVING)。したがって、JOINの後、テーブルをフィルタリングして、これらだけを残しますTRANSACTIONID

select t.* from RBOTRANSACTIONSALESTRANS t
join
(
select TRANSACTIONID,min(main.qty),max(main.qty) 
    from RBOTRANSACTIONSALESTRANS main 
GROUP BY TRANSACTIONID
HAVING (max(main.qty) < 0) 
         or 
       ((min(main.qty) < 0) and (max(main.qty) > 0))
) t1 on (t.TRANSACTIONID=t1.TRANSACTIONID)

UPD質問の下でコメントした後、内部クエリでこの条件のみを使用する必要があると思います。

HAVING not (min(main.qty) < 0)            
于 2013-01-10T11:09:21.587 に答える