sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel til visning af produktsalg

Du kan samle dataene ved hjælp af SUM- og CASE-udsagn.

Ved at bruge dine tabeldefinitioner (og nogle meget minimale opbyggede data) er her et eksempel på, hvordan du kan gøre det:

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

Forespørgslen bruger funktionen DENSE_RANK til at gruppere elementer af en størrelse sammen og til at bestille dem i en afsendelsesrækkefølge efter størrelse, og dette bruges til at finde ud af, hvilken kolonne dataene skal skrives til.

Selvom der er en PIVOT-operator i SQL Server 2005 og nyere, er den ikke særlig nyttig, når du har forskellige kolonneoverskriftstyper (varestørrelse og -antal i dette tilfælde).

Du skal beslutte dig for det maksimale antal produktstørrelser, du vil rapportere om, da dette er hårdkodet i forespørgslen. Så hvis det maksimale antal produktstørrelser er 3, koder du forespørgslen som vist ovenfor. Hvis et af dine produkter derimod har 4 forskellige størrelser, så vil du tilføje et ekstra varestørrelse og antal kolonnepar for t.Col =4 og så videre.

Jeg håber, at dette hjælper.



  1. Rake-opgaver ser ud til at ignorere database.yml-konfigurationen

  2. Forespørgselsomkostninger:Globale midlertidige tabeller vs. samlinger (virtuelle arrays)

  3. Hvordan indsætter man arrays i MySQL ved hjælp af Codeigniter?

  4. PostgreSQL flere transaktioner på samme forbindelse