Thursday, February 12, 2009

எளிய தமிழில் SQL - பாகம் 16

இன்றைய பாகம்-16ல் SQL ன் Aggregate Functions மற்றும், Grouping போன்றவற்றைக் காணலாம்.

இதற்கான ஒரு மாதிரி Table Structure கீழே:


இந்த Table ஐப் பயன்படுத்தி இன்றையப் பாகத்தைத் தொடருவோம்.

Aggregate Functions என்றால் என்ன?
SUM, AVG, MIN, MAX, COUNT போன்றவற்றைப் பயன்படுத்தி கணித விடை காணல். இதன் விடையாக ஒரே ஒரு மதிப்பு மட்டும் வெளியாகும்.


இந்த Tableல் மணி, வீரன், சந்த்ரு, ஹாரிஸ் ஆகிய 3 விற்பனையாளர்களும் வெவ்வேறு காலகட்டங்களில் வேறு வேறு பகுதிகளில் எவ்வளவு தொகைக்கு விற்பனை செய்துள்ளனர் என்பதை அறியக் கொடுத்துள்ளேன்.

அனைவரும் சேர்ந்து ஒட்டுமொத்தமாக எவ்வளவு தொகைக்குப் பொருட்களை விற்பனை செய்துள்ளனர். இதற்கு SUM பயன்படுத்தலாம்.

ஒட்டுமொத்தமான கூடுதல் தொகை.
SELECT SUM(SaleAmount) AS [Total Sale Amount] from Sales
விடை : 59310

அதிகபட்சமாக விற்பனையான தொகை
SELECT MAX(SaleAmount) AS [Maximum] from Sales
விடை : 7800

குறைந்தபட்சமாக விற்பனையான தொகை
SELECT MIN(SaleAmount) AS [Minimum] from Sales
விடை : 400

சராசரித் தொகை
SELECT AVG(SaleAmount) AS [Average] from Sales
விடை : 3954.000000

மொத்தத்தில் எத்தனை முறை விற்பனை நடந்துள்ளது?
SELECT count(*) AS [Total Transactions] from Sales
விடை : 15

மொத்தம் எத்தனை விற்பனையாளர்கள் ?
SELECT COUNT(DISTINCT SalesMan)AS [Total Persons Involved] FROM Sales
விடை:4

இங்கே மாதிரி Tableல் ஒவ்வொரு பிரதிநிதிகளும், ஒன்றுக்கு மேற்பட்டமுறை விற்பனை செய்துள்ளனர். ஆதலால் ஒவ்வொரு பிரதிநிதியின் தனிப்பட்ட கூடுதல், அதிகபட்ச / குறைந்தபட்ச விற்பனைத்தொகை முதலியவற்றைக் காண்பதற்கு GROUP BY பயன்படுத்தலாம்.

ஒவ்வொருவரின் தனிப்பட்ட விற்பனைத்தொகையைக் காண
SELECT SalesMan,SUM(SaleAmount) as [Individual SaleAmount]
FROM Sales GROUP BY SalesMan

விடை :



ஒவ்வொருவரின் அதிகபட்ச விற்பனைத்தொகையைக் காண்பதற்கு
SELECT SalesMan,MAX(SaleAmount) as [Individual Max Efficiency]
FROM Sales GROUP BY SalesMan

ஒவ்வொருவரின் குறைந்தபட்ச திறனைக் காண
SELECT SalesMan,MIN(SaleAmount) as [Individual Min Amt] FROM Sales GROUP BY SalesMan

SELECT உடன் மேலும் அதிகமான கட்டுப்பாடுகளை விதிப்பதற்கும் Conditionகளைக் கூறுவதற்கும் WHERE சேர்த்துப் பயன்படுத்துவோம். அதுபோல இங்கே Aggregate Functions பயன்படுத்தும்போது HAVING ஐ இணைத்துப் பயன்படுத்துவோம்.

விற்பனைப் பிரதிநிதிகளின் இரண்டாவது எழுத்து 'a' ஆக உள்ளவர்களையும், அவர்களது ஒட்டுமொத்த விற்றதொகையையும் காண

SELECT SalesMan,SUM(SaleAmount) as [Individual SaleAmount]
FROM Sales GROUP BY SalesMan
HAVING SalesMan LIKE '_a%'

_ மற்றும் % ஆகிய அடையாளங்களுக்கு Wild card characters என்று பெயர். அதாவது இட நிரப்பிகள். _ என்பது ஒரு எழுத்தை மட்டும் நிரப்பும். % என்பது அனைத்து எழுத்துகளையும் நிரப்பும்.
‘_a%' என்றால் முதல் எழுத்து ஏதோ ஒன்றாகவும், கண்டிப்பாக இரண்டாம் எழுத்து 'a' பிற எழுத்துகளைப் பற்றிக் கவலையில்லை. இப்படி எந்த பிரதிநிதியின் பெயரில் இரண்டாவது எழுத்து 'a' வருகிறதோ அவர்களை மட்டும் காண்பதற்கு.

ஒட்டுமொத்தத்தில் 20000 ஐ விட அதிகமாக விற்பனை செய்தவர்களை மட்டும் காண்பதற்கு:
SELECT SalesMan, SUM(SaleAmount) as [Individual SaleAmount] FROM Sales
GROUP BY SalesMan
HAVING SUM(SaleAmount) > 20000
மொத்தவிற்பனை 5000 ரூபாயைவிடக் குறைவாக விற்றவர் யார்?
SELECT SalesMan,SUM(SaleAmount) as [Individual SaleAmount] FROM Sales
GROUP BY SalesMan
HAVING SUM(SaleAmount) 5000 ரூபாய்கள் முதல் 20000 ரூபாய்கள் வரை விற்பனை செய்தோர் யாவர்?
SELECT SalesMan,SUM(SaleAmount) as [Individual SaleAmount] FROM Sales
GROUP BY SalesMan
HAVING SUM(SaleAmount) BETWEEN 1000 AND 20000



கீழே உள்ளதைக் கவனிக்கவும்.
SELECT SalesMan, SUM(SaleAmount) as [TotalSales], MAX(SaleAmount) as [Maximum], Min(SaleAmount) as [Minimum], count(SaleAmount)as [TotalTransaction] from Sales

நான் எதையோ எதிர்பார்த்து இப்படிக் கொடுத்தால் என்ன ஆகும். Sum, Max, Min, Count அனைத்தையும் கொடுத்துள்ளேன். ஆனால் GROUP BY மட்டும் கொடுக்காமல் விட்டுவிட்டேன். இப்போது என்ன ஆகும்?

கீழேயுள்ள பிழைச்செய்திதான் கிடைக்கும். குழுவாகப் பிரித்து ஒவ்வொருவரின் தனித்திறமையைக் காண்பதற்கே GROUP BY பயன்படுகிறது.
Msg 8120, Level 16, State 1, Line 1
Column 'Sales.SalesMan' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


இதைச் சரிசெய்த பிறகு,

SELECT SalesMan, SUM(SaleAmount) as [TotalSales], MAX(SaleAmount) as [Maximum], Min(SaleAmount) as [Minimum], count(SaleAmount)as [TotalTransaction]
from Sales
GROUP BY SalesMan

இதன் விடை:

1 comment:

வடுவூர் குமார் said...

முதலில் இருந்து ரிவைஸ் பண்ணிக்கொண்டு வந்ததால் வர தாமதமாகிவிட்டது.
இந்த sql வணிகத்துறையில் இருப்பவர்களுக்கு பெரிதும் உதவியாக இருக்கும் என்று நினைக்கிறேன்.
ஒரு சந்தேகம்...பல பொருள் அங்காடிகளில் இருக்கும் பொருட்களின் நிலவரத்தை இதன் மூலம் கண்காணிக்க முடியுமா?

எளிய தமிழில் SQL - பாகம் 17

பாகம் 15ல் திரு G. ராஜாராமன், சவுதி அரேபியா அவர்கள் கீழ்க்கண்ட கேள்வியை எழுப்பி இருந்தார். அவருக்கு விடையளிக்கும் விதமாக இந்தப்பதிவு அமைகிற...