Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskaj wszystkie sprzedane przedmioty na podstawie kolekcji przedmiotów z tabeli głównej w SQL Server

To prawdopodobnie zaprowadzi cię na większość drogi. Nie włożyłem logiki, aby przenieść kolumny podsumowań, ponieważ działałoby to tylko dla dwóch kategorii, a zakładam, że masz ich znacznie więcej.

CREATE TABLE #Master(ItemNo int,[Name] varchar(50), Category varchar(5)) 
INSERT INTO #Master VALUES(10001,'Apple','C1' )   
INSERT INTO #Master VALUES(10002, 'Coffee' ,'C1')  
INSERT INTO #Master VALUES(10003,'Bread','C2')   
INSERT INTO #Master VALUES(10004,'Beans' ,'C2')  

CREATe TABLE #Transactions(SiteID int,BusinessDate date,ItemName varchar(50),[Units Sold]int,[Units Sale]int,ItemNo int,  OrderNo varchar(20))
INSERT INTO #Transactions VALUES(1,'06/08/2018','Apple',1,5,10001,'122-1')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Coffee',1,16,10002,'122-1')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Bread',2,7,10003,'122-1')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Beans',9,18,10004,'122-1')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Apple',2,5,10001,'122-4')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Coffee',2,6,10002,'122-4')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Bread',1,7,10003,'122-4')
INSERT INTO #Transactions VALUES(1,'06/08/2018','Beans',4,8,10004,'122-4')
INSERT INTO #Transactions VALUES(2,'06/08/2018','Apple',2,5,10001,'122-2')
INSERT INTO #Transactions VALUES(2,'06/08/2018','Coffee',1,6,10002,'122-2')
INSERT INTO #Transactions VALUES(3,'06/08/2018','Bread',3,5,10003,'122-3')
INSERT INTO #Transactions VALUES(3,'06/08/2018','Beans',7,17,10004,'122-3')


;WITH CTE AS (
select MS.ItemNo,MS.Name,MS.Category, SUM(TR.[Units Sold]) RootItemSold, tr.OrderNo
from #Master MS
INNER JOIN #Transactions TR on MS.ItemNo = TR.ItemNo
GROUP BY MS.ItemNo,MS.Name,MS.Category, tr.OrderNo
),
MiddleCalc as
(
select ItemNo, [Name],Category,RootItemSold,OrderNo
,(SELECT ISNULL(SUM(1),0)  FROM CTE T2 where TRoot.OrderNo = t2.OrderNo and TRoot.Category <> t2.Category) HasOtherCategory
from CTE TRoot
)
SELECT ItemNo,[Name],[Category], 
CASE WHEN Category = 'C1' THEN
        SUM(RootItemSold)  
    ELSE
        SUM(CASE WHEN HasOtherCategory <> 0 THEN RootItemSold ELSE 0 END)  END C1,
CASE WHEN Category = 'C2' THEN
        SUM(RootItemSold)  
    ELSE
        SUM(CASE WHEN HasOtherCategory <> 0 THEN RootItemSold ELSE 0 END)  END C2
FROM MiddleCalc
GROUP BY ItemNo,[Name],[Category]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź/zmień poziom zgodności bazy danych w SQL Server (SSMS)

  2. Scal wiele baz danych w jedną bazę danych

  3. Zwróć jedną z dwóch kolumn w widoku — zależnie od tego, która z nich nie jest pusta

  4. zastąp NULL wartością pustą lub zerem w serwerze sql

  5. Wstawiaj zbiorczo pola o stałej szerokości