2016-08-18 2 views
0

СценарийT-SQL комплекс автообъединение

У меня есть сценарий, который включает в себя комплекс Самосоединения через другой, чтобы вернуть правильный результат. То, что я хочу сделать, - создать представление Ms SQL Server (2008) для представления данных.

Ситуация связана с отдельными компаниями, которые находятся в пределах цепочки, хранящей акции, и затем имеют возможность делиться этим запасом с другими компаниями в пределах сети, к которой они принадлежат. Правила таковы:

  • Если компания имеет запас продукта, и они совместно используют этот запас, то количество доступных для них является их запас плюс общий запас компаний в пределах своей цепи
  • Если компания владеет им, но они не делятся с этим запасом, а затем количество доступных им os их акций
  • Если компания не владеет акциями, тогда у них есть только количество доступных от других компаний в своей цепочке, которые делят акции что у них есть

Столы

Create Table dbo.Chain(
    ChainId int Identity(1,1) Not Null PRIMARY KEY, 
    Name nvarchar(255) Not Null) 
Go 
Insert into Chain(Name)Values('Technology Brothers') 
Insert into Chain(Name)Values('Kings Of Tech') 
Go 

Create Table dbo.Company(
    CompanyId int Identity(1,1) Not Null PRIMARY KEY, 
    Name nvarchar(255) Not Null, 
    ChainId int Not Null) 
Go 
Insert into Company(Name, ChainId)Values('Techies', 1) 
Insert into Company(Name, ChainId)Values('MotherboardsRUs', 1) 
Insert into Company(Name, ChainId)Values('RAM Bros', 1) 
Insert into Company(Name, ChainId)Values('Silicon Station', 2) 
Insert into Company(Name, ChainId)Values('Nerd Place', 2) 
Go 

Create Table dbo.Product(
    ProductId int Identity(1,1) Not Null PRIMARY KEY, 
    Name nvarchar(255) Not Null) 
Go 
Insert into Product(Name)Values('Laser Mouse') 
Insert into Product(Name)Values('MBoard 101') 
Insert into Product(Name)Values('CAT Cable') 
Insert into Product(Name)Values('Big Screen') 
Insert into Product(Name)Values('J Speakers') 
Insert into Product(Name)Values('Blue USB') 

Create Table CompanyProduct(
    CompanyProductId int Identity(1,1) Not Null PRIMARY KEY, 
    CompanyId int, 
    ProductId int, 
    Quantity int, 
    IsShared bit) 
Go 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 1, 10, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 2, 1, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 3, 5, 0) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(1, 4, 2, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(2, 1, 5, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(2, 2, 10, 0) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 3, 1, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 4, 4, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(3, 5, 10, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(4, 1, 5, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(4, 3, 10, 0) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 2, 2, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 4, 10, 1) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 5, 3, 0) 
Insert into CompanyProduct(CompanyId, ProductId, Quantity, IsShared)Values(5, 6, 8, 0) 
Go 

Ожидаемый результат

Результаты должны включать одну строку для каждой компании по каждому продукту, где есть количество доступных для них. Другими словами, если у них нет запаса, и никто в их цепочке не делится ничем, тогда не будет строки для этого продукта. В противном случае будет строка с количеством, которым они владеют, количеством, совместно используемым с ними, и общим количеством, которое у них есть для них.

В приведенной ниже таблице приведены результаты для данных, вставленных выше.

CompanyId ChainId  ProductId IsShared My Quantity Shared Quantity Total Quantity 
1   1   1   1   10    5     15 
1   1   2   1   1    0     1 
1   1   3   0   5    NULL    5 
1   1   4   1   2    4     6 
1   1   5   NULL  0    10    10 
2   1   1   1   10    5     15 
2   1   2   0   10    NULL    10 
2   1   3   NULL  0    1     1 
2   1   4   NULL  0    6     6 
2   1   5   NULL  0    10    10 
3   1   1   NULL  0    15    15 
3   1   2   NULL  0    1     1 
3   1   3   1   1    0     1 
3   1   4   1   4    2     6 
3   1   5   1   10    0     10 
4   2   1   1   5    0     5 
4   2   2   1   0    2     2 
4   2   3   0   10    NULL    10 
4   2   4   NULL  0    10    10 
5   2   1   NULL  0    5     5 
5   2   2   1   2    0     2 
5   2   4   1   10    0     10 
5   2   5   0   3    NULL    3 
5   2   6   0   8    NULL    8 

ответ

0

Это немного грязно, но я думаю, вы сможете использовать это, чтобы получить нужные вам данные.

SELECT com.name, pro.name, ISNULL(cop.Quantity, 0) [Own Stock], ISNULL(cop.Quantity, 0) + SUM(ISNULL(copsha.Quantity, 0)) [Shared Stock] 
FROM Company com 
JOIN Chain cha ON cha.ChainId = com.ChainId 
LEFT JOIN Product pro ON pro.ProductId = pro.ProductId 
LEFT JOIN CompanyProduct cop ON cop.CompanyId = com.CompanyId 
        AND pro.ProductId = cop.ProductId 
JOIN Company comsha ON comsha.CompanyId <> com.CompanyId 
       AND comsha.ChainId = com.ChainId 
LEFT JOIN CompanyProduct copsha ON (copsha.CompanyId = comsha.CompanyId 
          AND copsha.ProductId = pro.ProductId) 
WHERE copsha.IsShared = 1 
GROUP BY com.name, pro.name, cop.ProductId, cop.Quantity 
HAVING ISNULL(cop.Quantity, 0) > 0 
OR SUM(ISNULL(copsha.Quantity, 0)) > 0 
Смежные вопросы