2012-09-13 14 views
5

Microsoft SQL सर्वर प्रबंधक 2008एसक्यूएल संग्रहीत प्रक्रिया गुजर पैरामीटर

का उपयोग करते हुए एक संग्रहीत प्रक्रिया है कि "अंततः" परेटो सूची में शीर्ष 10 का चयन करेंगे बनाना। लेकिन मैं नीचे भी 10 को खोजने के लिए इसे फिर से चलाने के लिए चाहूंगा।

अब, क्वेरी को दोबारा दोहराने की बजाय, मैं यह देखने की कोशिश कर रहा हूं कि क्वेरी में पैरामीटर पास करने का कोई तरीका है या नहीं ऑर्डर से desc तक क्रम।

क्या ऐसा करने का कोई तरीका है जो मुझे कोड को दोहराने से बचाएगा?

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto @orderby 
+0

"डेटा" क्या डेटा प्रकार है? – podiluska

उत्तर

7

केवल थोड़ा मूर्खतापूर्ण द्वारा किया जा रहा:

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto 
ORDER by CASE WHEN @orderby='ASC' THEN Pareto END, 
     CASE WHEN @orderby='DESC' THEN Pareto END DESC 

आप नहीं करते सख्ती से सब पर एक CASE अभिव्यक्ति में दूसरे प्रकार हालत डाल करने के लिए (जरूरत *), और यदि Pareto संख्यात्मक है, तो आप केवल CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

करने का निर्णय ले सकते हैं

(*) दूसरी तरह की स्थिति केवल तब प्रभाव डालती है जब पहली तरह की स्थिति दो पंक्तियों को बराबर मानती है। यह या तो जब दोनों पंक्तियों में एक ही परेटो मूल्य है (इसलिए क्रम उल्टा करें भी बराबर उन पर विचार करेंगे) क्योंकि पहली CASE अभिव्यक्ति लौटने NULL एस के, (ताकि @orderby नहीं 'ASC' है है, तो हम DESC निष्पादित करना चाहते हैं । क्रम में

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 

SELECT * FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY Pareto) as rn1, 
     ROW_NUMBER() OVER (ORDER BY Pareto DESC) as rn2 
    FROM (
     SELECT Peroid1.Pareto 
     FROM dbo.Peroid1 
     GROUP by Pareto 
    ) t 
) t2 
WHERE rn1 between 1 and 10 or rn2 between 1 and 10 
ORDER BY rn1 

यह आप शीर्ष 10 और नीचे 10 दे देंगे,: प्रकार


तुम भी एक ही बार में दोनों परिणाम सेट पुन: प्राप्त करने के बजाय दो कॉल करने पर विचार करना चाह सकते हैं ऊपर से नीचे तक। लेकिन यदि कुल मिलाकर 20 से कम परिणाम हैं, तो आपको अपनी वर्तमान योजना के विपरीत डुप्लीकेट नहीं मिलेगा।

+0

उत्कृष्ट उत्तर, मदद के लिए धन्यवाद, बहुत अच्छी तरह से काम करता है – lemunk

+0

@Damien_The_Unbeliever आप क्यों कहते हैं कि यह "थोड़ा मूर्ख" है? – BritishDeveloper

1

कोशिश:

CREATE PROCEDURE [dbo].[TopVRM] 
(@orderby varchar(255) 
AS 
IF @orderby='asc' 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto asc 
ELSE 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto desc 
संबंधित मुद्दे