は、それが一時テーブルの助けを借り
SELECT
s.SellerId,
ProductList = STUFF((
SELECT ',' + ProductCode FROM Stocks
WHERE s.SellerId = Stocks.SellerId
ORDER BY ProductCode FOR XML PATH('')
)
, 1, 1, ''), COUNT(*) AS numberOfProducts
INTO #tmptable
FROM
Stocks s
WHERE
s.ProductCode IN ('30A','20A','42B')
AND s.StockData > 0
GROUP BY s.SellerId;
/*this second temp table is necessary, so we can delete from one of them*/
SELECT * INTO #tmptable2 FROM #tmptable;
DELETE t1 FROM #tmptable t1
WHERE EXISTS (SELECT 1 FROM #tmptable2 t2
WHERE t1.SellerId != t2.SellerId
AND t2.ProductList LIKE '%' + t1.ProductList + '%'
AND t2.numberOfProducts > t1.numberOfProducts)
;
SELECT Name FROM #tmptable t INNER JOIN Sellers ON t.SellerId = Sellers.Id;
UPDATEで動作するようになった:tmpTable2に同じ
CREATE TABLE tmptable (SellerId int, ProductList nvarchar(max), numberOfProducts int);
:
静的テーブルと試しているしてください。上記のコードを
INSERT INTO tmpTable
SELECT
s.SellerId,
ProductList = STUFF((
SELECT ',' + ProductCode FROM Stocks
WHERE s.SellerId = Stocks.SellerId
ORDER BY ProductCode FOR XML PATH('')
)
, 1, 1, ''), COUNT(*) AS numberOfProducts
FROM
Stocks s
WHERE
s.ProductCode IN ('30A','20A','42B')
AND s.StockData > 0
GROUP BY s.SellerId;
INSERT INTO tmpTable2 SELECT * FROM tmpTable;
DELETE t1 FROM tmptable t1
WHERE EXISTS (SELECT 1 FROM tmptable2 t2
WHERE t1.SellerId != t2.SellerId
AND t2.ProductList LIKE '%' + t1.ProductList + '%'
AND t2.numberOfProducts > t1.numberOfProducts)
;
SELECT * FROM tmpTable;
DROP TABLE tmpTable, tmpTable2;
に変更します.Wich RDBMSは、MS SQL Server、MySQL、PostgreSQL ...を使用していますか?私はMSのSQL ServerはSQLのフィドルがそれを使用していると思います。必要なタグを追加します。そしてあなたが追加したSQL Fiddleのリンクは、あなたの質問をよりよく編集してそこに追加するので、質問を見ている他のユーザーは、すべてのコメントをすべて調べて、すべての情報を持っていることを確認する必要はありません – Yaroslav
私は、注文を満たすことができる最低限の数のサプライヤーを探したい。あなたはおそらくサプライヤーのリストを供給可能なアイテムの総数で注文したいと思うでしょうが、コーディングは難しいかもしれません。 – bendataclear
私はあなたの問題はここでより複雑になっていると思います。両方の売り手が同じ量の商品を持っている場合はどうなりますか(異なる商品ですか?) –