2014-09-03 4 views
6

मैं एसक्यूएल सर्वर 2008R2 में निम्नलिखित चार टेबल:एसक्यूएल सर्वर: एक SQL क्वेरी में अनुक्रम गणना

DECLARE @ParentGroup TABLE (ParentGroup_ID INT, ParentGroup_Name VARCHAR(100)); 
DECLARE @ChildGroup TABLE (ChildGroup_id INT, ChildGroup_name VARCHAR(100), ParentGroup_id INT); 
DECLARE @Entity TABLE ([Entity_id] INT, [Entity_name] VARCHAR(100)); 
DECLARE @ChildGroupEntity TABLE (ChildGroupEntity_id INT, ChildGroup_id INT, [Entity_ID] INT); 
INSERT INTO @parentGroup VALUES (1, 'England'), (2, 'USA'); 
INSERT INTO @ChildGroup VALUES (10, 'Sussex', 1), (11, 'Essex', 1), (12, 'Middlesex', 1); 
INSERT INTO @entity VALUES (100, 'Entity0'),(101, 'Entity1'),(102, 'Entity2'),(103, 'Entity3'),(104, 'Entity4'),(105, 'Entity5'),(106, 'Entity6'); 
INSERT INTO @ChildGroupEntity VALUES (1000, 10, 100), (1001, 10, 101), (1002, 10, 102), (1003, 11, 103), (1004, 11, 104), (1005, 12, 100), (1006, 12, 105), (1007, 12, 106); 
/* 
SELECT * FROM @parentGroup 
SELECT * FROM @ChildGroup 
SELECT * FROm @entity 
SELECT * FROM @ChildGroupEntity 
*/ 

तालिकाओं के बीच संबंधों के रूप में नीचे:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 0 [ChildGroupSequence], 0 [EntitySequence] 
FROM @ChildGroupEntity cge 
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id 
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id 
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID] 
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name] 

ऊपर के उत्पादन क्वेरी है:

------------------------------------------------------------------------------- 
ParentGroup_Name|ChildGroup_name|Entity_name|ChildGroupSequence|EntitySequence| 
------------------------------------------------------------------------------- 
England   |Essex   |Entity3 |0     |0    | 
England   |Essex   |Entity4 |0     |0    | 
England   |Middlesex  |Entity0 |0     |0    | 
England   |Middlesex  |Entity5 |0     |0    | 
England   |Middlesex  |Entity6 |0     |0    | 
England   |Sussex   |Entity0 |0     |0    | 
England   |Sussex   |Entity1 |0     |0    | 
England   |Sussex   |Entity2 |0     |0    | 
------------------------------------------------------------------------------- 

अब, मैं बाल समूहों और बाल समूहों से जुड़े सभी संस्थाओं को जानना चाहता हूं मूल समूह 1. इसके अलावा के लिए, मैं गणना करने के लिए [ChildGroupSequence] चाहते हैं, [EntitySequence] नीचे तर्क के लिए के रूप में:

  1. ChildGroupSequence स्तंभ मूल समूह के भीतर बच्चे समूह के अनुक्रम का प्रतिनिधित्व करना चाहिए, 1000 से शुरू होने वाले और incrementing 100 तक। मैं पहला उपसमूह 1000 होगा, दूसरा उपसमूह 1100 होगा।
  2. EntitySequence कॉलम को 100 से शुरू होने और एकल अंकों से बढ़ने, प्रत्येक उपसमूह के लिए रीसेट करने के लिए बच्चे समूह के भीतर इकाई अनुक्रम का प्रतिनिधित्व करना चाहिए। अर्थात। 100 पर childgroup 1 शुरू होता है में पहली इकाई, के रूप में 2.

तो childgroup में पहली इकाई करता है, उत्पादन निम्न स्वरूप में होना चाहिए:

------------------------------------------------------------------------------- 
ParentGroup_Name|ChildGroup_name|Entity_name|ChildGroupSequence|EntitySequence| 
------------------------------------------------------------------------------- 
England   |Essex   |Entity3 |1000    |100   | 
England   |Essex   |Entity4 |1000    |101   | 
England   |Middlesex  |Entity0 |1100    |100   | 
England   |Middlesex  |Entity5 |1100    |101   | 
England   |Middlesex  |Entity6 |1100    |102   | 
England   |Sussex   |Entity0 |1200    |100   | 
England   |Sussex   |Entity1 |1200    |101   | 
England   |Sussex   |Entity2 |1200    |102   | 
------------------------------------------------------------------------------- 

मैं पढ़ने के द्वारा आसानी से कर सकते एप्लिकेशन लेयर (नेट प्रोग्राम) में मान, लेकिन इस तरह की कुछ छोटी चीजों का प्रयोग करके SQL सर्वर सीखना चाहते हैं। क्या कोई इस SQL ​​क्वेरी को लिखने में मेरी सहायता कर सकता है?

किसी भी मदद की बहुत सराहना की जाएगी। अग्रिम में धन्यवाद।

संपादित करें: मेरा नमूना डेटा पहले नियम को सही ढंग से प्रतिबिंबित नहीं कर रहा था, नियम बताता है कि बाल समूह की मात्रा 100 से बढ़ी जानी चाहिए और नमूना आउटपुट में वृद्धि 1 होनी चाहिए। दूसरी क्वेरी 100 से वृद्धि को दर्शाती है। @jpw : इसे इंगित करने के लिए बहुत बहुत धन्यवाद।

उत्तर

1

मेरा मानना ​​है कि यह इस तरह partitioning और ranking कार्यों का उपयोग कर पूरा किया जा सकता:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    999 + DENSE_RANK() OVER(PARTITION BY ParentGroup_Name ORDER BY ChildGroup_name) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY ParentGroup_Name, ChildGroup_name ORDER BY ChildGroup_name, Entity_name) AS [EntitySequence] 
FROM @ChildGroupEntity cge 
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id 
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id 
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID] 
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name] 

इस क्वेरी नमूना उत्पादन आप वर्णित उत्पन्न करता है।

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    900 + 100 * DENSE_RANK() OVER(PARTITION BY ParentGroup_Name ORDER BY ChildGroup_name) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY ParentGroup_Name, ChildGroup_name ORDER BY ChildGroup_name, Entity_name) AS [EntitySequence] 
FROM @ChildGroupEntity cge 
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id 
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id 
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID] 
ORDER BY ParentGroup_Name, ChildGroup_name, [Entity_name] 

कृपया देखें: अपने नमूना डेटा हालांकि सही ढंग से पहला नियम को प्रतिबिंबित करने के नियम के रूप में कहा गया है कि ChildGroupSequence 100 से वृद्धि की जानी चाहिए और 1. द्वारा नमूना उत्पादन वेतन वृद्धि दूसरा प्रश्न 100 से वेतन वृद्धि को दर्शाता है प्रतीत नहीं होता दोनों प्रश्नों के उदाहरणों के लिए यह sample SQL Fiddle

शायद क्वेरी और के रूप में यह एक कम आईडी है आईडी के आधार पर विभाजन नहीं होना चाहिए नाम दें, यदि ऐसा है तो ससेक्स एसेक्स से पहले आ जाएगा और क्वेरी इस होगा:

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
    900 + 100 * DENSE_RANK() OVER(PARTITION BY pg.ParentGroup_ID ORDER BY cg.ChildGroup_ID) AS [ChildGroupSequence], 
    99 + ROW_NUMBER() OVER(PARTITION BY pg.ParentGroup_ID, cg.ChildGroup_ID ORDER BY cg.ChildGroup_ID, cge.Entity_ID) AS [EntitySequence] 
FROM @ChildGroupEntity cge 
INNER JOIN @ChildGroup cg ON cg.ChildGroup_id=cge.ChildGroup_id 
INNER JOIN @parentGroup pg ON pg.parentGroup_id=cg.parentGroup_id 
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID] 
ORDER BY pg.ParentGroup_ID, cg.ChildGroup_ID, [Entity_name] 
+0

आप इस उत्तर के लिए बहुत बहुत धन्यवाद, बहुत सराहना की। – Sathish

1
SELECT ParentGroup_Name, 
     ChildGroup_name, 
     [Entity_name], 
     LU.R [ChildGroupSequence], 
     99 + ROW_NUMBER() OVER (PARTITION BY LU.ParentGroup_id,LU.ChildGroup_id ORDER BY ChildGroup_name) [EntitySequence] 
FROM @ChildGroupEntity cge 
JOIN (
     SELECT cg.ChildGroup_id, 
       cg.ChildGroup_name, 
       pg.ParentGroup_id, 
       pg.ParentGroup_Name,  
       999 + (ROW_NUMBER() OVER (ORDER BY cg.ChildGroup_id)) [R] 
     FROM @ChildGroup cg 
     JOIN @parentGroup pg On pg.ParentGroup_ID = cg.ParentGroup_ID) LU 
     ON  cge.ChildGroup_id = LU.ChildGroup_id 
INNER JOIN @entity e ON e.[entity_id]=cge.[Entity_ID] 
ORDER BY LU.ParentGroup_Name, LU.ChildGroup_name, e.[Entity_name] 

परिणाम:

enter image description here

+1

इस उत्तर के लिए बहुत बहुत धन्यवाद, बहुत सराहना की। मुझे पहले नमूना आउटपुट गलत मिला है, लेकिन आपकी क्वेरी वास्तव में मेरे नमूना आउटपुट में जो दिखाया गया था उसे वापस कर रहा था। – Sathish

1

आप इस ranking functions

012 का उपयोग करके हल कर सकते हैं

परिणाम आप यहां पा सकते हैं SQL Fiddle

+0

इस उत्तर के लिए बहुत बहुत धन्यवाद, बहुत सराहना की। मुझे पहले नमूना आउटपुट गलत मिला है, लेकिन आपकी क्वेरी वास्तव में मेरे नमूना आउटपुट में जो दिखाया गया था उसे वापस कर रहा था। – Sathish

संबंधित मुद्दे