sql >> Database >  >> RDS >> Sqlserver

SQL-query voor het weergeven van productverkopen

U kunt de gegevens samenvoegen met SUM- en CASE-statements.

Met behulp van uw tabeldefinities (en enkele zeer minimaal verzonnen gegevens), is hier een voorbeeld van hoe u dit zou kunnen doen:

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

De query gebruikt de functie DENSE_RANK om items van een bepaalde grootte te groeperen en ze in oplopende volgorde van grootte te ordenen en dit wordt gebruikt om uit te zoeken naar welke kolom de gegevens moeten worden geschreven.

Hoewel er een PIVOT-operator is in SQL Server 2005 en hoger, is het niet erg handig als u verschillende typen kolomkoppen hebt (in dit geval artikelgrootte en aantal).

U moet beslissen over het maximale aantal productgroottes waarover u wilt rapporteren, aangezien dit hard gecodeerd is in de query. Dus als het maximale aantal productmaten 3 is, codeert u de zoekopdracht zoals hierboven weergegeven. Als een van uw producten echter 4 verschillende maten heeft, voegt u een extra paar kolommen Artikelgrootte en Aantal toe voor t.Col =4 enzovoort.

Ik hoop dat dit helpt.



  1. Hoe rijen samen te vouwen tot een door komma's gescheiden lijst in een SQL-query in MySql

  2. Hoe genereer je een dynamische sequentietabel in MySQL?

  3. Invoegen in tabel van verzamelingstype Oracle 12c - ORA-00902:ongeldig gegevenstype

  4. MYSQL onbekende clausule join kolom in volgende join