セットアップ:
CREATE TABLE #ord (
OrderId VARCHAR(20),
ProductCode VARCHAR(40),
qty int
)
INSERT INTO #ord (OrderId, ProductCode, Qty)
VALUES
('SS1234','Widget1',1)
,('SS1234','Widget2',3)
,('SS1234','Widget3',1)
,('SS1234a','Widget1',1)
,('SS1234a','Widget2',3)
,('SS1234a','Widget3',1)
,('xSS1234','Widget1',1)
,('xSS1234','Widget2',3)
,('xSS1234','Widget3',1)
,('xSS1234','Widget4',1)
,('ySS1234','Widget1',10)
,('ySS1234','Widget2',3)
,('ySS1234','Widget3',1)
,('zSS1234','Widget2',3)
,('zSS1234','Widget3',1)
;
問合せ:
with CTE as (
select distinct
o.OrderID, ca.ProductString, ca.QtyString
from #ord o
cross apply (
SELECT
STUFF((
SELECT
', ' + o2.ProductCode
FROM #ord o2
WHERE o.OrderID = o2.OrderID
ORDER BY o2.ProductCode
FOR XML PATH ('')
)
, 1, 1, '')
, STUFF((
SELECT
', ' + cast(o2.Qty as varchar)
FROM #ord o2
WHERE o.OrderID = o2.OrderID
ORDER BY o2.ProductCode
FOR XML PATH ('')
)
, 1, 1, '')
) ca (ProductString, QtyString)
)
select
ProductString, QtyString, count(*) Num_Orders
from CTE
group by
ProductString, QtyString
having
count(*) > 1
order by
Num_Orders DESC
, ProductString
結果:
ProductString QtyString Num_Orders
Widget1, Widget2, Widget3 1, 3, 1 2
参照:http://rextester.com/DJEN59714
あなたの編集は、難しい問題を読むようにしました。サンプル入力と期待する出力を、その出力のロジックと一緒に示してください。 –
それでは、productcode = productcodeとqty = qtyとorderid!= orderidの自己結合が好きですか?どれだけ多くの「ウィジェット」が一致する必要がありますか? – ZLK
正確な数量と部品番号に一致するように探していることがわかります。しかし、将来的には、これを拡張して部品番号(色、重量など)の類似性を調べることもできます。より柔軟なアプローチが必要な場合は、コサインの類似性を調べてみてください –