首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个复杂的sql话语,求指点

2013-06-19 
一个复杂的sql语句,求指点两个表,商品表Goods和价格表Prices. 一个商品对应多个价格,不同的时间有不同的价

一个复杂的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


求: 最近有降过价的商品.
用最后一次记录的价格减去上一次记录的价格,结果>0 的商品,按UpdateTime倒序。

大侠帮忙写一下实现语句,谢谢。


[解决办法]
能不能给点数据
[解决办法]
试试
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--上面忘了倒序


[解决办法]

用触发器或把新增Prices表的语句封装更装Goods 日期列

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

热点排行
Bad Request.