0

列に基づいてクエリに含める必要があるレコードを計算する必要があるという問題があります。

私のテーブルは次のようになります

Client_Id   Event   ProductID   Date            Cart

1           rem     28          2012-02-23      573473
1           add     28          2012-02-23      573473
1           rem     24          2012-02-23      573473

イベント列に add と rem があることがわかりますが、これは基本的に、ユーザーがカートに製品を追加または削除したことを意味します。

私が取得する必要があるのは、たとえば productID 28 の値が正の場合にのみレコードです。

28 add one, remove = 0 は、カートにアイテムがないことを意味します。

このために私が書いたクエリは次のようなものです。

SELECT Client_Id,
       Event,
       ProductID,
       Date,
       Cart
FROM   (SELECT *,
               'Include' = CASE
                             WHEN Total > 0 THEN 1
                             ELSE 0
                           END
        FROM   (SELECT *,
                       [ADD] + REM AS Total
                FROM   (SELECT *,
                               'ADD' = CASE
                                         WHEN Event = 'add' THEN 1
                                         ELSE 0
                                       END,
                               'REM' = CASE
                                         WHEN Event = 'rem' THEN -1
                                         ELSE 0
                                       END
                        FROM   Feed) a)b)c
WHERE  c.[Include] = 1

しかし、行の合計ではなく、その行のproductIDのみを計算しているため、これは間違っていると思わざるを得ません。

誰かが私を正しい方向に向けることができますか?

ありがとう

4

3 に答える 3

3

おそらく、次の組み合わせを使用することを検討してください。

  • 「add」と「rem」をそれぞれ SELECT / UNION ALL で +1 と -1 に変換します
  • GROUP BY と SUM を使用して結果を集計する

上記の概念を示す疑似 SQL を次に示します。

select sum(quantity), Client_Id, ProductId, Cart
from
(
select  1 quantity, *
from    feed
where  event = 'add'
union all
select  -1 quantity, *
from    feed
where  event = 'rem'
) temp
Group BY Client_Id, ProductId, Cart
于 2012-05-08T10:39:26.430 に答える
1

これを試して:

    SELECT * 
      FROM (SELECT sum(CASE WHEN event = 'add'THEN 1 ELSE 0 END),
           productid
      FROM feed
     GROUP BY productid
     HAVING sum(DECODE(event,'rem', 0, 'add' ,1,0)) > 0
      ) A, feed
  WHERE A.productid = feed.productid
于 2012-05-08T10:42:13.730 に答える
0

時間を横向きに考えてください。削除操作の場合は、productid に -1 を掛けてから、合計して > 0 を選択します。

ただし、28 を 2 つ追加するとどうなりますか。それはあなたに56を与えるでしょう、それは何か他のものです....

個人的には、イベント列を捨てて、数量列を追加し、それを削除のマイナスにします。5 つの 28 を追加して 4 つを削除するなど...

于 2012-05-08T10:29:08.400 に答える