5

最も効果的な行を見つけるためのクエリを書きたいです。私はこれらのテーブルを持っています:

Sellers
Id   Name
1    Mark
2    Julia
3    Peter

Stocks
 Id   SellerId   ProductCode   StockCount
 1       1         30A            10
 2       2         20A             4
 3       1         20A             2
 4       3         42B             3

そしてそこにsqlfiddle http://sqlfiddle.com/#!6/fe5b1/1/0

私の意図は、在庫に最適な売り手を見つけます。

クライアントが 30A、20A、および 42B 製品を希望する場合。マークは両方の製品 (30A と 20A) を持っているので、"Mark" と "Peter" に戻る必要があります。Julia は必要ありません。

これを sql で解決するにはどうすればよいですか?

4

2 に答える 2

3

一時テーブルの助けを借りて動作するようになりました

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;

アップデート:

静的テーブルを試してみてください:

CREATE TABLE tmptable (SellerId int, ProductList nvarchar(max), numberOfProducts int);

tmpTable2 についても同様です。次に、上記のコードを次のように変更します

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;
于 2013-02-14T10:06:10.320 に答える
-2

これはあなたが探しているものかもしれないと思いますか?

Select name,sum(stockdata) as stockdata from sellers s1 join Stocks s2 on s1.id=s2.sellerid
where ProductCode in ('30A','20A','42B')
group by name
order by sum(stockdata) desc

お役に立てば幸いです。

上位2名のみが必要な場合。あなたが書く

Select top 2 name,sum(stockdata) as stockdata from sellers s1 join Stocks s2 on s1.id=s2.sellerid
where ProductCode in ('30A','20A','42B')
group by name
order by sum(stockdata) desc

これがあなたが探しているものだと思います。私の見方では、最高の在庫データを持つ 2 人を選択したいのですか?

于 2013-02-14T08:53:59.053 に答える