列内で値が異なる同じIDを持つレコードを除外します。

以下の問題の解決に誰かが私を手伝ってくれる?

create table [order1] (order_id int, CartTransaction_Id int, Status_Id int);
insert into [order1] values
(357488,87214,1),
(357489,87214,8),
(357490,87214,1),
(357491,87214,1),
(343980,87216,1),
(357483,87216,1);

create table [Status1] (Type VARCHAR(100), Status_Id int);
insert into [Status1] values
('New','1'),
('Awaiting Approval','8'),
('New','1'),
('New','1'),
('New','1'),
('New','1');

    select
A.Order_Id, A.CartTransaction_Id, A.Status_Id, B.Type, B.Status_Id
FROM order1 A
JOIN dbo.Status1 B ON dbo.A.Status_Id = dbo.B.Status_Id
--AND B.Type = 'New' 
order by A.CartTransaction_Id

以下は上記のクエリから得た出力です。

enter image description here

以下は期待された結果でした

enter image description here

CartTransaction_Idのグループ内のすべてのorder_idのステータスタイプが 'New'である場合にのみデータを入力する必要があります

発注から、order_id status_typeの1つが承認待ちになっていたので、CartTransaction_Id(87214)を除外する必要があります。

0
nl ru de
SQL ServerとMySQLの答えは異なる場合があります。一つを選ぶ!構文が適用されないため、MySQLタグを削除しました。
追加された 著者 lurks,
注文357491が含まれていなかったのはなぜですか?または357490?
追加された 著者 Vikram,
Status1テーブルで同じステータスペア( 'New'、1)が5回繰り返されるのはなぜですか?また、テーブルにキーやインデックスはありますか?
追加された 著者 erik,
order_idをチェックした場合357491または357490は両方とも87214以下(カート取引ID)です。前述のように、CartTransaction_Idのグループ内のすべてのorder_idに対してステータスタイプが 'New'である場合にのみデータを入力する必要があります。
追加された 著者 Anonymous181,

4 答え

あなたは例えばこれを行うことができます:

select
A.Order_Id, A.CartTransaction_Id, A.Status_Id, B.Type, B.Status_Id
FROM order1 A
JOIN dbo.Status1 B ON dbo.A.Status_Id = dbo.B.Status_Id
where
not exists (select 1 from order1 o1 where o1.CartTransaction_Id = A.CartTransaction_Id and o1.Status_Id != 1)
order by A.CartTransaction_Id

大量のデータがある場合は、max + overなど、他の選択肢を確認してください。

1
追加された

これを試して:

SELECT  A.Order_Id, A.CartTransaction_Id, A.Status_Id, B.Type, B.Status_Id
FROM    order1 A
JOIN    Status1 B
    ON A.Status_Id = B.Status_Id
OUTER APPLY (SELECT TOP 1 C.CartTransaction_Id FROM order1 C WHERE A.CartTransaction_Id = C.CartTransaction_Id AND C.Status_Id <> 1) C
WHERE   C.CartTransaction_Id IS NULL
ORDER BY A.CartTransaction_Id
1
追加された

まず、[Status1]テーブルへの挿入はそれほど多く必要ありません。

create table [Status1] (Type VARCHAR(100), Status_Id int);
insert into [Status1] values
('New','1'),
('Awaiting Approval','8');

あなたの参加に十分になるでしょう。

ここに私があなたが欲しいものを得るためにROW_NUMBERを使って答えを持っています。

;with Orders as (
    select A.Order_Id [OrderID]
    , A.CartTransaction_Id [CartTransactionID]
    , A.Status_Id [OrderStatus]
    , B.Type [StatusType]
    , B.Status_Id [StatusID]
    , ROW_NUMBER() OVER(PARTITION BY A.CartTransaction_Id, A.Status_Id ORDER BY A.CartTransaction_Id, A.Status_Id) RowNo
from order1 a join status1 b on a.status_id = b.status_id
)
select o.OrderID
    , o.CartTransactionID
    , o.OrderStatus
    , o.StatusType
    , o.StatusID 
from orders o
Where 1=1
and o.RowNo = 1
and o.StatusID = 1 --o.StatusType='new'
0
追加された

あなたのStatus1テーブルは "NEW"の複数のエントリを持つ必要がありますか... 以下でなければクエリはうまくいくはずです

select
A.Order_Id, A.CartTransaction_Id, A.Status_Id, B.Type, B.Status_Id
FROM order1 A
JOIN dbo.Status1 B ON A.Status_Id = B.Status_Id
WHERE NOT EXISTS (SELECT 1 FROM order1 c WHERE c.CartTransaction_Id = 
a.CartTransaction_Id AND c.Status_Id <> 1)
order by A.CartTransaction_Id
0
追加された