خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را
نحوه استفاده از HAV ING در SQL Server
HAVING در SQL Server مشخص می کند که دستور SQL باید فقط ردیف هایی را بازگرداند که توابع Aggregate، با شرایط تعیین شده مطابقت داشته باشند. در ادامه مثال هایی از HAVING را مشاهده خواهید کرد که هم با طرز کار و هم نحوه استفاده آن آشنا خواهید شد.
Syntax استفاده از HAVING به فرم زیر می باشد.
COLUMN_1, COLUMN_2 در یک aggregate function قرار نگرفته اند از این رو باید در GROUP BY گنجانده شوند.
AGGREGATE_FUNCTION می تواند توابعی همچون MAX یا MIN یا AVG یا SUM یا COUNT باشد.
WHERE CONDITION شرط مورد نظر را در WHERE مشخص می کنید که اختیاری می باشد.
HAVING شرطی است که فقط برای Result های Aggregate شده اعمال می شود تا گروه های ردیف برگشتی را محدود کند.
خب، برای شروع کار، ابتدا یک جدول با نام ITEM_DETAILS ایجاد خواهیم کرد.
در اسکریپت زیر، فقط مواردی را برمی گرداند که کل مقدار خریداری شده ی آنها از 1500 بیشتر باشد.
همانطور که مشاهده می کنید ، دو مورد را برمی گرداند که مقدار کل خریداری شده برای آنها بیشتر از 1500 است.
همین مورد فوق را در گروه اسکریپت SQL می خواهیم درک کنیم.
Group By مجموع مقدار خرید را برای هر مورد جداگانه جمع می کند. در اسکریپت زیر هم همین مورد را مشاهده خواهید کرد.
پس از آن Having نتیجه جمع شده از GROUP BY را برای بررسی شرایط تعیین شده فیلتر می کند و فقط مواردی را که کل مقدار خریداری شده آنها بیشتر از 1500 باشد در خروجی می توانید مشاهده کنید.
در واقع فیلتر دوم پس از GROUP BY توسط HAVING برقرار می شود.
در اسکریپت زیر مقدار کل خریداری شده را برای هر مورد که تعداد کل تعداد خریداری شده آنها بیش از 6 باشد را برمی گرداند.
همانطور که مشاهده می کنید، تعداد کل تعداد خریداری شده در ستون TOTAL_QTY_CNT، برای همه موارد بیشتر از 6 است.
Syntax استفاده از HAVING به فرم زیر می باشد.
SELECT COLUMN_1, COLUMN_2, .., AGGREGATE_FUNCTION (COLUMN_NAME)
FROM TABLE_NAME [WHERE CONDITION]
GROUP BY COLUMN_1, COLUMN_2, ..,
HAVING [ conditions ]
ORDER BY ASC|DESC
COLUMN_1, COLUMN_2 در یک aggregate function قرار نگرفته اند از این رو باید در GROUP BY گنجانده شوند.
AGGREGATE_FUNCTION می تواند توابعی همچون MAX یا MIN یا AVG یا SUM یا COUNT باشد.
WHERE CONDITION شرط مورد نظر را در WHERE مشخص می کنید که اختیاری می باشد.
HAVING شرطی است که فقط برای Result های Aggregate شده اعمال می شود تا گروه های ردیف برگشتی را محدود کند.
خب، برای شروع کار، ابتدا یک جدول با نام ITEM_DETAILS ایجاد خواهیم کرد.
CREATE TABLE dbo.ITEM_DETAILS (
ID INT NOT NULL, ITEM VARCHAR(50), ITEM_QTY INT, ITEM_PURCHASED_DATE DATETIME)
INSERT INTO dbo.ITEM_DETAILS (ID, ITEM, ITEM_QTY, ITEM_PURCHASED_DATE)
VALUES (1, 'Scanner', 300, '2019-12-01 00:00:00.000'),
(2, 'Scanner', 250, '2019-12-10 00:00:00.000'),
(3, 'Scanner', 110, '2019-11-12 00:00:00.000'),
(4, 'Scanner', 110, '2019-09-19 00:00:00.000'),
(5, 'Scanner', 280, '2019-09-25 00:00:00.000'),
(6, 'Scanner', 180, '2019-08-15 00:00:00.000'),
(7, 'Scanner', 180, '2019-07-08 00:00:00.000'),
(8, 'Pen Drive', 360, '2019-12-15 00:00:00.000'),
(9, 'Pen Drive', 270, '2019-09-11 00:00:00.000'),
(10, 'Pen Drive', 210 ,'2019-08-22 00:00:00.000'),
(11, 'Pen Drive', 190 ,'2019-08-19 00:00:00.000'),
(12, 'Pen Drive', 480 ,'2019-07-15 00:00:00.000'),
(13, 'Pen Drive', 680, '2019-06-25 00:00:00.000'),
(14, 'Pen Drive', 120, '2019-06-18 00:00:00.000'),
(15, 'Hard Disk', 270, '2019-09-19 00:00:00.000'),
(16, 'Hard Disk', 210, '2019-08-12 00:00:00.000'),
(17, 'Hard Disk', 190, '2019-08-29 00:00:00.000'),
(18, 'Hard Disk', 480, '2019-07-25 00:00:00.000'),
(19, 'Hard Disk', 680, '2019-06-15 00:00:00.000'),
(20, 'Hard Disk', 120, '2019-06-28 00:00:00.000')
در اسکریپت زیر، فقط مواردی را برمی گرداند که کل مقدار خریداری شده ی آنها از 1500 بیشتر باشد.
SELECT ITEM , SUM(ITEM_QTY) AS TOTAL_QTY
FROM dbo.ITEM_DETAILS
GROUP BY Item
HAVING SUM(ITEM_QTY) > 1500
همانطور که مشاهده می کنید ، دو مورد را برمی گرداند که مقدار کل خریداری شده برای آنها بیشتر از 1500 است.
همین مورد فوق را در گروه اسکریپت SQL می خواهیم درک کنیم.
Group By مجموع مقدار خرید را برای هر مورد جداگانه جمع می کند. در اسکریپت زیر هم همین مورد را مشاهده خواهید کرد.
SELECT ITEM , SUM(ITEM_QTY) AS TOTAL_QTY
FROM dbo.ITEM_DETAILS
GROUP BY Item
پس از آن Having نتیجه جمع شده از GROUP BY را برای بررسی شرایط تعیین شده فیلتر می کند و فقط مواردی را که کل مقدار خریداری شده آنها بیشتر از 1500 باشد در خروجی می توانید مشاهده کنید.
در واقع فیلتر دوم پس از GROUP BY توسط HAVING برقرار می شود.
SELECT ITEM , SUM(ITEM_QTY) AS TOTAL_QTY
FROM dbo.ITEM_DETAILS
GROUP BY Item
SELECT ITEM , SUM(ITEM_QTY) AS TOTAL_QTY
FROM dbo.ITEM_DETAILS
GROUP BY Item
HAVING SUM(ITEM_QTY) >1500
در اسکریپت زیر مقدار کل خریداری شده را برای هر مورد که تعداد کل تعداد خریداری شده آنها بیش از 6 باشد را برمی گرداند.
SELECT ITEM , SUM(ITEM_QTY) AS TOTAL_QTY, COUNT(ITEM_QTY) AS TOTAL_QTY_CNT
FROM dbo.ITEM_DETAILS
GROUP BY Item
HAVING COUNT(ITEM_QTY)>6
همانطور که مشاهده می کنید، تعداد کل تعداد خریداری شده در ستون TOTAL_QTY_CNT، برای همه موارد بیشتر از 6 است.
نمایش دیدگاه ها (0 دیدگاه)
دیدگاه خود را ثبت کنید: