2014-09-03 14 views
6

Tôi có bốn bảng sau trong SQL Server 2008R2:SQL server: tính toán chuỗi trong một truy vấn 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 
*/ 

Các mối quan hệ giữa các bảng như sau:

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] 

Đầu ra của trên truy vấn là:

------------------------------------------------------------------------------- 
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    | 
------------------------------------------------------------------------------- 

Bây giờ, tôi muốn tìm hiểu các nhóm con và tất cả các thực thể được liên kết với các nhóm con cho nhóm mẹ 1. Ngoài ra, tôi muốn tính [ChildGroupSequence], [EntitySequence] đối với logic bên dưới:

  1. Cột ChildGroupSequence phải trình bày chuỗi của nhóm con trong nhóm chính, bắt đầu từ 1000 và tăng dần 100. Nhóm phụ thứ nhất sẽ là 1000, nhóm phụ thứ hai sẽ là 1100.
  2. Cột EntitySequence phải đại diện cho chuỗi thực thể trong nhóm con, bắt đầu từ 100 và tăng dần bằng các chữ số đơn, đặt lại cho từng nhóm con. I E. đơn vị đầu tiên trong childgroup 1 bắt đầu từ 100, cũng như các thực thể đầu tiên trong childgroup 2.

Vì vậy, đầu ra phải ở trong các định dạng sau:

------------------------------------------------------------------------------- 
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   | 
------------------------------------------------------------------------------- 

tôi có thể làm điều này dễ dàng bằng cách đọc các giá trị vào lớp ứng dụng (chương trình .Net), nhưng muốn tìm hiểu máy chủ SQL bằng cách thử nghiệm một vài điều nhỏ như thế này. Bất cứ ai có thể giúp tôi bằng văn bản truy vấn SQL này?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn trước.

EDIT: Dữ liệu mẫu của tôi dường như không phản ánh chính xác quy tắc đầu tiên, quy tắc cho biết rằng ChildGroupSequence phải được tăng thêm 100 và kết quả đầu ra mẫu tăng lên 1. Truy vấn thứ hai phản ánh số gia tăng 100. @jpw : Cảm ơn bạn rất nhiều vì đã chỉ ra điều này.

Trả lời

1

Tôi tin rằng điều này có thể được thực hiện bằng partitioningranking chức năng như thế này:

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] 

truy vấn này tạo ra đầu ra mẫu mà bạn mô tả. dữ liệu mẫu của bạn dường như không phản ánh một cách chính xác các quy tắc đầu tiên mặc dù là quy tắc nói rằng ChildGroupSequence nên được tăng lên 100 và các gia số lượng mẫu bằng 1. Các truy vấn thứ hai phản ánh sự tăng bởi 100:

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] 

Xin xem này sample SQL Fiddle cho ví dụ về cả hai truy vấn.

Có thể truy vấn nên phân vùng bằng ID và không tên, nếu có Sussex sẽ đến trước khi Essex vì nó có một ID thấp hơn và truy vấn sẽ là:

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

Cảm ơn bạn rất nhiều vì câu trả lời này, được đánh giá rất nhiều. – 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] 

Kết quả:

enter image description here

+1

Cảm ơn bạn rất nhiều vì câu trả lời này, rất được đánh giá cao. Tôi đã có sản lượng mẫu sai trước đó, nhưng truy vấn của bạn đã chính xác trả lại những gì tôi đã được minh họa trong đầu ra mẫu của tôi. – Sathish

1

Bạn có thể giải quyết điều này bằng cách sử dụng ranking functions

SELECT ParentGroup_Name, ChildGroup_name, [Entity_name], 
     899 + DENSE_RANK() OVER(PARTITION BY ParentGroup_Name ORDER BY ChildGroup_name) + 
     100 * DENSE_RANK() OVER(ORDER BY ParentGroup_Name ASC) AS ChildGroupSequence, 
     99 + ROW_NUMBER() OVER(PARTITION BY ParentGroup_Name, ChildGroup_name ORDER BY [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] 

Kết quả bạn có thể tìm thấy tại đây SQL Fiddle

+0

Cảm ơn bạn rất nhiều vì câu trả lời này, rất được đánh giá cao. Tôi đã có sản lượng mẫu sai trước đó, nhưng truy vấn của bạn đã chính xác trả lại những gì tôi đã được minh họa trong đầu ra mẫu của tôi. – Sathish

Các vấn đề liên quan