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

Zapytanie SQL do wyświetlania sprzedaży produktów

Możesz agregować dane za pomocą instrukcji SUM i CASE.

Korzystając z definicji tabeli (i kilku bardzo minimalnych wymyślonych danych), oto przykład, jak możesz to zrobić:

--** Create test tables
DECLARE @SalesLog TABLE ( 
SalesID int IDENTITY(1,1) NOT NULL, 
MemoNo int NULL, 
ProductCode int NULL, 
Quantity int NULL, 
Price int NULL, 
ProductGroup int NULL)

DECLARE @Products TABLE( 
ProductId int IDENTITY(1,1) NOT NULL, 
pName nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
pSize int NULL, 
pPrice int NULL, 
pPackQty int NULL, 
pGroup int NULL, 
pCode int NULL, 
pStock int NULL, 
pYrStock int NULL, 
pClearStock int NULL)

--** Setup test data
INSERT INTO @SalesLog ( MemoNo, ProductCode, Quantity, Price, ProductGroup)
SELECT   0, 1, 500, 0, 1 UNION
SELECT   0, 2, 700, 0, 1 UNION   
SELECT   0, 2, 333, 0, 1 UNION   
SELECT   0, 3, 200, 0, 2 UNION
SELECT   0, 4, 125, 0, 2 ;

INSERT INTO @Products (pName, pSize, pPrice, pPackQty, pGroup, pCode, pStock, pYrStock, pClearStock)
SELECT 'Beer', 350, 1 , 1, 1, 1, 0, 0, 0 UNION
SELECT 'Beer', 650, 1 , 1, 1, 2, 0, 0, 0 UNION
SELECT 'Beer', 1000, 1 , 1, 1, 3, 0, 0, 0 UNION
SELECT 'Wine', 750, 1 , 1, 2, 4, 0, 0, 0 UNION 
SELECT 'Wine', 1000, 1 , 1, 2, 5, 0, 0, 0 ;

--** Example query
SELECT t.pName AS 'Product'
     , MAX(CASE WHEN t.Col = 1 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 1 THEN t.Quantity END),0) AS 'Quantity'
     , MAX(CASE WHEN t.Col = 2 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 2 THEN t.Quantity END),0) AS 'Quantity'
     , MAX(CASE WHEN t.Col = 3 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 3 THEN t.Quantity END),0) AS 'Quantity'
FROM (
SELECT pName
     , pCode
     , pGroup
     , pSize
     , sl.Quantity
     , DENSE_RANK() OVER(PARTITION BY p.pGroup ORDER BY p.pSize) AS Col
  FROM @Products AS p
  LEFT JOIN @SalesLog AS sl
    ON p.pGroup = sl.ProductGroup
   AND p.pCode = sl.ProductCode
     ) AS t
 GROUP BY t.pGroup
     , t.pName
;   

Zapytanie wykorzystuje funkcję DENSE_RANK, aby pogrupować elementy o określonym rozmiarze i uporządkować je według rozmiaru, co służy do ustalenia, w której kolumnie należy zapisać dane.

Chociaż w SQL Server 2005 i nowszych istnieje operator PIVOT, nie jest on zbyt pomocny, gdy masz różne typy nagłówków kolumn (w tym przypadku rozmiar i ilość elementów).

Będziesz musiał zdecydować o maksymalnej liczbie rozmiarów produktów, które chcesz raportować, ponieważ jest to na stałe zakodowane w zapytaniu. Jeśli więc maksymalna liczba rozmiarów produktu wynosi 3, kodujesz zapytanie tak, jak pokazano powyżej. Jeśli jednak jeden z Twoich produktów ma 4 różne rozmiary, dodasz dodatkową parę kolumn Item Size i Quantity dla t.Col =4 i tak dalej.

Mam nadzieję, że to pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyczyścić dziennik transakcji programu SQL Server?

  2. Znajdź wszystkie luki między liczbami całkowitymi w SQL

  3. Tworzenie widoku z powiązanych tabel podrzędnych

  4. SQL pobiera tylko wartości liczbowe z varchar

  5. Utwórz widok z klauzulą ​​ORDER BY