Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL заявка за показване на продажбите на продукти

Можете да обобщите данните, като използвате изрази SUM и CASE.

Използвайки вашите дефиниции на таблици (и някои много минимални измислени данни), ето пример как можете да го направите:

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

Заявката използва функцията DENSE_RANK, за да групира елементи с определен размер заедно и да ги подреди в ред на размера и това се използва, за да се определи в коя колона трябва да се записват данните.

Въпреки че има оператор PIVOT в SQL Server 2005 и по-нова версия, той не е много полезен, когато имате различни типове заглавия на колони (размер на елемента и количество в този случай).

Ще трябва да вземете решение за максималния брой размери на продукта, за които искате да докладвате, тъй като това е твърдо кодирано в заявката. Така че, ако максималният брой размери на продукта е 3, тогава кодирате заявката, както е показано по-горе. Ако обаче един от вашите продукти има 4 различни размера, тогава ще добавите допълнителна двойка колони за размер на артикула и количество за t.Col =4 и т.н.

Надявам се това да помогне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Shred XML - Работа с пространства от имена

  2. Проблем с RAISERROR след миграцията към SQL Server 2012

  3. Номериращи острови в SQL Server 2012

  4. Как да получите всички грешки на всички SSIS пакети в решение

  5. Закръгляване на стойност в колона varchar в MS SQL Server 2012?