Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage zur Anzeige von Produktverkäufen

Sie könnten die Daten mithilfe von SUM- und CASE-Anweisungen aggregieren.

Unter Verwendung Ihrer Tabellendefinitionen (und einiger sehr minimaler erfundener Daten) ist hier ein Beispiel dafür, wie Sie es tun könnten:

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

Die Abfrage verwendet die DENSE_RANK-Funktion, um Elemente einer Größe zusammenzufassen und sie in der Reihenfolge ihrer Größe zu ordnen, und dies wird verwendet, um herauszufinden, in welche Spalte die Daten geschrieben werden sollen.

Obwohl es in SQL Server 2005 und höher einen PIVOT-Operator gibt, ist er nicht sehr hilfreich, wenn Sie unterschiedliche Typen von Spaltenüberschriften haben (in diesem Fall Elementgröße und -menge).

Sie müssen sich für die maximale Anzahl von Produktgrößen entscheiden, über die Sie berichten möchten, da dies in der Abfrage fest codiert ist. Wenn also die maximale Anzahl von Produktgrößen 3 ist, codieren Sie die Abfrage wie oben gezeigt. Wenn jedoch eines Ihrer Produkte 4 verschiedene Größen hat, fügen Sie ein zusätzliches Spaltenpaar aus Artikelgröße und Menge für t.Col =4 hinzu und so weiter.

Ich hoffe, das hilft.