webForumDet fria alternativet

Beräkna försäljningsstatistik

4 svar · 524 visningar · startad av Dino

DinoMedlem sedan sep. 20011 914 inlägg
#1

Sql Server 2005

Skulle behöva lite försäljningsstatistik från nedan tabeller.

1. Antal sålda för en viss produkt per dag mellan två datum.
2. Antal sålda för en viss produkt per månad mellan två datum.
3. Antal sålda för en viss produkt per år mellan två datum.

Antal = [Orderitem.Quantity]
Produkt = [Orderitem.ProductId = @productid]
Order status = [Order.Status = 600]
Mellan datum = [Order.CreateDate BETWEEN @date1 AND @date2]

Exempel:
2004 - 101
2005 - 54
2006 - 0
2007 - 133

Om det då inte finns något för ett visst år/månad/dag så skall värdet vara 0.

CREATE TABLE [Order] (
	[Id] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
	[Status] [int] NOT NULL ,
	[CreateDate] [smalldatetime] NOT NULL ,
	CONSTRAINT [PK_Order] PRIMARY KEY  CLUSTERED 
	(
		[Id]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO

CREATE TABLE [OrderItem] (
	[Id] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
	[OrderId] [int] NOT NULL ,
	[ProductId] [int] NOT NULL ,
	[Quantity] [int] NOT NULL ,
	[RowTotal] [money] NOT NULL ,
	CONSTRAINT [PK_OrderItem] PRIMARY KEY  CLUSTERED 
	(
		[Id]
	)  ON [PRIMARY] 
) ON [PRIMARY]
GO
DinoMedlem sedan sep. 20011 914 inlägg
#2

Ok, har nu skapat en Kalender tabell.

CREATE TABLE dbo.Calendar  
(  
    dt SMALLDATETIME NOT NULL 
        PRIMARY KEY CLUSTERED
) 
GO

Och fyllt den med några datum.

SET NOCOUNT ON 
DECLARE @dt SMALLDATETIME 
SET @dt = '20070101' 
WHILE @dt < '20270101' 
BEGIN 
    INSERT dbo.Calendar(dt) SELECT @dt 
    SET @dt = @dt + 1 
END

Och kan med förljande kod ta ut per dag.

SELECT	c.dt as [Date], COALESCE(SUM(oi.Quantity),0) as Quantity
FROM	dbo.Calendar as c LEFT OUTER JOIN 
		dbo.[Order] as o ON o.CreateDate >= c.dt
		AND o.CreateDate < dateadd(day,1,c.dt) INNER JOIN 
			dbo.[OrderItem] as oi ON o.Id = oi.OrderId
WHERE	(oi.ProductId = @productid) AND c.dt BETWEEN @startdate AND @enddate
GROUP BY c.dt
ORDER BY c.dt;

Men skulle behöva hjälp med att ta ut per månad och per år.

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Per månad

SELECT	year(c.dt), month(c.dt), COALESCE(SUM(oi.Quantity),0) as Quantity
FROM	dbo.Calendar as c LEFT OUTER JOIN 
		dbo.[Order] as o ON o.CreateDate >= c.dt
		AND o.CreateDate < dateadd(day,1,c.dt) INNER JOIN 
			dbo.[OrderItem] as oi ON o.Id = oi.OrderId
WHERE	(oi.ProductId = @productid) AND c.dt BETWEEN @startdate AND @enddate
GROUP BY year(c.dt), month(c.dt)
ORDER BY year(c.dt), month(c.dt)
DinoMedlem sedan sep. 20011 914 inlägg
#4

Och utan month() för per år då.

Men är det möjligt att sätta per månad till bara två kolumner.
Typ:
2007-10 | 22
2007-11 | 4

DinoMedlem sedan sep. 20011 914 inlägg
#5

Ok, lyckades få ihop det med.

SELECT (cast(year(c.dt) as varchar(4)) + '-' + cast(month(c.dt)as varchar(2))), COALESCE(SUM(oi.Quantity),0) as Quantity

Tackar för hjälpen.

131 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)