0

これを分割して欲しいものを見つける方法があるかもしれないと思いますが、見えません。製品セットに関するわずかに正規化されていないデータがあります。

SetItemID   ComponentItemID quantity    IsPrimary
123         234             1           1
123         345             2           0
456         567             3           1
456         678             2           0

quantity記述されているが、たとえば、IsPrimaryコンポーネントのquantity>'IsPrimary=0component's数量であるセットを見つける必要があります。また、コンポーネント間などで数量が等しいセットを見つける必要があります。必要に応じて、これに複数のステートメントを使用してもかまいません。

私がこれまでに持っているのは、これを行う正しい方法である場合とそうでない場合がある部分的なステートメントですが、セット内の数量を比較する方法を理解するPARTITIONことはできません:

WITH setdata as
(select *, row_number() OVER(
    PARTITION by s.setitemid order by s.setitemid) position from set_table s )
// descending just to get newer sets
SELECT* from setdata order by setitemid desc
4

2 に答える 2

0

私があなたの要件に正しく従っているなら、これはそれをするべきです:

SELECT p1.SetItemId
 from (--  IsPrimary = 1
       select SetItemID, ComponentItemId, Quantity
        from SetData
        where IsPrimary = 1) p1
  inner join (--  IsPrimary = 0
              select SetItemID, ComponentItemId, Quantity
               from SetData
               where IsPrimary = 0) p0
   on p0.SetItemID = p1.SetItemID
    and p1.Quantity > p0.Quantity
  --and p1.Quantity = p0.Quantity

等しい量のセットには、その最後の行を使用します。

于 2012-09-07T13:35:20.000 に答える
0
SELECT *
FROM   set_table a
WHERE  isPrimary = 1
       AND quantity > (SELECT quantity
                       FROM   set_table b
                       WHERE  a.setItemId = b.setItemId
                              AND isPrimary = 0)
ORDER  BY setItemId DESC

または

SELECT a.*
FROM   set_table a
       INNER JOIN set_table b
               ON a.setItemId = b.setItemId
                  AND a.isPrimary = 1
                  AND b.isPrimary = 0
WHERE  a.quantity > b.quantity
于 2012-09-07T13:39:30.467 に答える