一个复杂的sql语句,求指点
两个表,商品表Goods和价格表Prices. 一个商品对应多个价格,不同的时间有不同的价格。每天都添加一次价格,并更新Goods表的UpdateTime字段。
表结构如下:
CREATE TABLE Goods(
[Id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [nvarchar](80) NOT NULL,
[Image_url] [varchar](400) NULL,
[UpdateTime] [datetime] NOT NULL
)
GO
CREATE TABLE Prices(
[Id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Price] [money] NOT NULL,
[GId] [int] NOT NULL,--商品表的Id
[Time] [datetime] NOT NULL
)
SELECT [id],[name],[image_url],[UpdateTime],SUM([Price])
FROM (
SELECT g.*,p.[Price]
FROM Goods G INNER JOIN Prices P ON g.id=p.gid
WHERE EXISTS (SELECT 1 FROM (
SELECT g.NAME ,MAX( [UpdateTime]) [UpdateTime]
FROM Goods G
GROUP BY g.NAME )b WHERE g.NAME=b.NAME AND g.[UpdateTime]=b.[UpdateTime])
UNION ALL
SELECT g.*,-1*p.[Price]
FROM Goods G INNER JOIN Prices P ON g.id=p.gid
WHERE EXISTS (SELECT 1 FROM (
SELECT g.NAME ,MAX( [UpdateTime])-1 [UpdateTimeY]--获取上一天的日期
FROM Goods G
GROUP BY g.NAME )b WHERE g.NAME=b.NAME AND g.[UpdateTime]=b.[UpdateTimeY]))a
GROUP BY [id],[name],[image_url],[UpdateTime]
HAVING SUM([Price])<0
---最近有降过价的商品.
CREATE TABLE Goods(
[Id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [nvarchar](80) NOT NULL,
[Image_url] [varchar](400) NULL,
[UpdateTime] [datetime] NOT NULL
)
GO
CREATE TABLE Prices(
[Id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Price] [money] NOT NULL,
[GId] [int] NOT NULL,--商品表的Id
[Time] [datetime] NOT NULL
)
Go
Insert into Prices(Price,GId,Time)
Select 10,1,'20100101' Union All
Select 20,1,'20100102' Union All
Select 15,1,'20100103' Union All
Select 10,2,'20100101' Union All
Select 20,2,'20100102' Union ALl
Select 10,3,'20100101'
Insert Into Goods(Name,UpdateTime)
Select 'a','20100103' Union All
Select 'b','20100102' Union All
Select 'c','20100101'
Go
--------- 查出最近减价的商品
With t as
(Select *,ROW_NUMBER() Over(Partition by gid order by [time] desc) as rn
From Prices)
Select t1.Id,t1.Price,t1.GId,t1.Time
From t as t1
Left Join t as t2
On t1.GId = t2.GId
Where t1.rn = t2.rn - 1
And t2.rn is not null
And t1.Price - t2.Price < 0
Order by t1.Time desc--上面忘了倒序
create trigger tr_Prices_insert on Prices
for insert
as
update g
set [UpdateTime] =i.[Time]
from Goods as g
inserted as i on g.ID=i.GID