2012-03-22 7 views
5

वर्तमानविलक्षण पंक्ति

Name Quantity 
--------------- 
Stella  2 
Jennifer  2 
Greg   3 

अनुरोधित परिणाम

Name Quantity 
--------------- 
Stella  1 
Stella  1 
Jennifer  1 
Jennifer  1 
Greg   1 
Greg   1 
Greg   1 

मैं इसे कैसे करना चाहिए में मूल्य चालू करें?

declare @T table 
( 
    Name varchar(50), 
    Sales int 
) 
insert into @T values 
('Stella', '2'), 
('Jennifer', '2'), 
('Greg',  '3') 
+0

एसक्यूएल संबंधपरक डेटा के साथ सबसे अच्छा खेलता है। आपका परिणाम एक संबंध नहीं है क्योंकि इसमें डुप्लिकेट पंक्तियां हैं। – onedaywhen

उत्तर

2

प्रत्यावर्तन का उपयोग करते हुए और माइकल Fredrickson का सेटअप कोड उधार:

declare @T table ( 
    Name varchar(50), 
    Sales int 
) 

insert into @T values ('Stella', '2') 
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',  '3') 

-- Recursive verion 
;with People (Name, Sales) as 
(
    select Name, Sales 
    from @T 
    union all 
    select Name, Sales - 1 
    from People 
    where Sales - 1 > 0 
) 
select Name, 1 as Quantity 
from People 
option (maxrecursion 0) -- Recurse without limit 

यह मेरा बॉक्स पर तेजी से चलाने के लिए लगता है (5x माइकल Fredrickson के तुलना में तेजी से क्वेरी योजना के अनुसार, लेकिन साथ कई और तार्किक पढ़ता है), यह नहीं कि यह बहुत मायने रखता है।

+0

+1 मेरा नाम दो बार कहने के लिए। इसके अलावा, अच्छे समाधान के लिए। –

2

आप शायद यह करने के लिए एक पहले से भरे संख्या तालिका से चर्चा करना चाहेंगे:

declare @T table ( 
    Name varchar(50), 
    Sales int 
) 

declare @numbers table (
    Number int 
) 

insert into @numbers values (1) 
insert into @numbers values (2) 
insert into @numbers values (3) 
insert into @numbers values (4) 
-- Etc... up to however many numbers is the max possible value for sales... 

insert into @T values ('Stella', '2') 
insert into @T values ('Jennifer', '2') 
insert into @T values ('Greg',  '3') 

SELECT 
    t.Name, 
    1 AS Sales 
FROM 
    @T t JOIN 
    @numbers n ON 
     t.Sales >= n.Number 
ORDER BY t.Name 

आप इसे कैसे कर सकता है, लेकिन मैं पर यकीन नहीं है क्यों आप करेंगे कि यह करना चाहते हैं।

4

यदि quantity कॉलम में अधिकतम मान 32,767 से कम ज्ञात है, तो आप संख्या उत्पन्न करने और अपने परिणाम प्राप्त करने के लिए संख्याओं में शामिल होने के लिए Recursion का उपयोग कर सकते हैं।

/******************************************* 
    Max Recursion Count in SQL Server is 32767 
    Limitation of 32767 Numbers! 
******************************************/ 
;WITH Numbers (Number) AS 
(
    SELECT 1 
    UNION ALL 
    SELECT 1 + Number FROM Numbers WHERE Number < 100 
) 
SELECT m.Name, 
     Quantity = 1 
    FROM MyTable m 
     JOIN @numbers n ON m.Quantity <= n.Number 
OPTION (MAXRECURSION 32767); 
+0

आप 100 से अधिक जा सकते हैं। MAXRECURSION [इस पृष्ठ पर] देखें (http://msdn.microsoft.com/en-us/library/ms175972.aspx) –

+0

@TimLehner: मुझे बताने के लिए धन्यवाद। मैं जवाब अपडेट कर दूंगा। – Akhil

+0

आप अनंतता पर जाने के लिए MAXRECURSION 0 का भी उपयोग कर सकते हैं। :) –