PDA

View Full Version : درخواست کمک برای نوشتن یک دستور Select عجیب



salmanbnd
چهارشنبه 02 مهر 1393, 01:33 صبح
سلام
فرض بفرمایید یک جدول فاکتورها، یک جدول کالاها داشته باشیم و برای کالاهای فروخته شده (با فاکتور) همچین جدولی با این داده ها داشته باشیم(ارتباط چند به چند):


ردیف

شماره فاکتور

شماره کالا



1

100

A



2

100

B



3

100

C



4

101

A



5

101

C



6

102

B



7

102

D




من میخوام از این لیست، فاکتورهایی نمایش بدم که کالای A و B با هم فروش رفته باشه. (نه جدا)
یعنی تنها فاکتور 100 قابل قبول است چرا که A و B در کنار هم فروخته شده است.
فاکتور 101 کالا A را دارد اما B را ندارد، پس قابل قبول نیست. همچنین فاکتور 102 کالا B را دارد اما A را ندارد و این هم قابل قبول نیست.
ممنون میشم کمک بفرمایید.

N_D
چهارشنبه 02 مهر 1393, 09:50 صبح
DROP TABLE #T;

Create Table #T( RW int, FactorNO int, Goods nvarchar(10) );
Insert #T VALUES
(1,100,'A'),
(2,100,'B'),
(3,100,'C'),
(4,101,'A'),
(5,101,'C'),
(6,102,'B'),
(7,102,'D');

-- First solution
SELECT RW,FactorNO,Goods FROM
(
SELECT RW,FactorNO,Goods, SUM( CASE Goods WHEN 'A' THEN 1 WHEN 'B' THEN 1 ELSE 0 END) OVER(PARTITION BY FactorNO) AS CNT
FROM #T
) A
WHERE CNT >= 2;

-- Second solution
SELECT RW,FactorNO,Goods FROM #T
WHERE FactorNO in(
SELECT FactorNO FROM #T
WHERE Goods in( 'A','B')
GROUP BY FactorNO
HAVING Count(*)>=2
);

salmanbnd
چهارشنبه 02 مهر 1393, 09:58 صبح
DROP TABLE #T;

Create Table #T( RW int, FactorNO int, Goods nvarchar(10) );
Insert #T VALUES
(1,100,'A'),
(2,100,'B'),
(3,100,'C'),
(4,101,'A'),
(5,101,'C'),
(6,102,'B'),
(7,102,'D');

-- First solution
SELECT RW,FactorNO,Goods FROM
(
SELECT RW,FactorNO,Goods, SUM( CASE Goods WHEN 'A' THEN 1 WHEN 'B' THEN 1 ELSE 0 END) OVER(PARTITION BY FactorNO) AS CNT
FROM #T
) A
WHERE CNT >= 2;

-- Second solution
SELECT RW,FactorNO,Goods FROM #T
WHERE FactorNO in(
SELECT FactorNO FROM #T
WHERE Goods in( 'A','B')
GROUP BY FactorNO
HAVING Count(*)>=2
);


بسیار ممنونم، الان به SQL دسترسی ندارم تا دستورو تست کنم اما فکر میکنم کاملا درسته و از شما بسیار ممنونم.
فقط سوالی که الان به ذهنم در خصوص قسمت HAVING Count(*)>=2 هستش، تعداد کالاهای انتخابی به جای "2" قرار بدم، درسته؟ میشه بفرمایید این قسمت چه کاری انجام میده؟

salmanbnd
چهارشنبه 02 مهر 1393, 22:24 عصر
بسیار ممنونم، الان به SQL دسترسی ندارم تا دستورو تست کنم اما فکر میکنم کاملا درسته و از شما بسیار ممنونم.
فقط سوالی که الان به ذهنم در خصوص قسمت HAVING Count(*)>=2 هستش، تعداد کالاهای انتخابی به جای "2" قرار بدم، درسته؟ میشه بفرمایید این قسمت چه کاری انجام میده؟

حل شد، گرفتم.
خیلی خیلی ممنونم