如我有表
商品
公司 部门 姓名 商品名称 价格 折扣
PS 市场 小张 苹果 60 0.8
PY 业务 小红 苹果 50 0.5
...现在要查询出 同一种商品 价格*折扣最小的记录 (公司 部门 姓名 为主键)
如上面的苹果就为
PY 业务 小红 苹果 50 0.5谢谢
商品
公司 部门 姓名 商品名称 价格 折扣
PS 市场 小张 苹果 60 0.8
PY 业务 小红 苹果 50 0.5
...现在要查询出 同一种商品 价格*折扣最小的记录 (公司 部门 姓名 为主键)
如上面的苹果就为
PY 业务 小红 苹果 50 0.5谢谢
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (公司 VARCHAR(2),部门 VARCHAR(4),姓名 VARCHAR(4),商品名称 VARCHAR(4),价格 INT,折扣 NUMERIC(2,1))
INSERT INTO #T
SELECT 'PS','市场','小张','苹果',60,0.8 UNION ALL
SELECT 'PY','业务','小红','苹果',50,0.5--SQL查询如下:SELECT *
FROM #T AS t
WHERE 价格*折扣=(
SELECT MIN(价格*折扣)
FROM #T
WHERE 商品名称=t.商品名称
)/*
公司 部门 姓名 商品名称 价格 折扣
---- ---- ---- ---- ----------- ---------------------------------------
PY 业务 小红 苹果 50 0.5(1 行受影响)*/
where not exists (
select 1 from 商品
where 商品名称=a.商品名称
and 价格*折扣<a.价格*a.折扣
)
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (公司 VARCHAR(2),部门 VARCHAR(4),姓名 VARCHAR(4),商品名称 VARCHAR(4),价格 INT,折扣 NUMERIC(2,1))
INSERT INTO #T
SELECT 'PS','市场','小张','苹果',60,0.8 UNION ALL
SELECT 'PY','业务','小红','苹果',50,0.5--SQL查询如下:SELECT DISTINCT b.*
FROM #T AS a
CROSS APPLY
(
SELECT TOP 1 *
FROM #T
WHERE 商品名称=a.商品名称
ORDER BY 价格*折扣
) AS b/*
公司 部门 姓名 商品名称 价格 折扣
---- ---- ---- ---- ----------- ---------------------------------------
PY 业务 小红 苹果 50 0.5(1 行受影响)*/
select a.* from 商品 a inner join (select 公司,商品名称,min(价格*折扣) from 商品 group by 公司,商品)t on t.公司=a.公司 and t.商品=a.商品
declare @t table
(
公司 char(2),
部门 varchar(10),
姓名 varchar(20),
商品名称 varchar(10),
价格 int,
折扣 decimal(10,2)
)insert @t select 'PS','市场','小张','苹果',60,0.8
union all select 'PY','业务','小红','苹果',50,0.5
insert @t select 'PS','市场','小张','葡萄',50,0.5
union all select 'PY','业务','小红','葡萄',60,0.8 select
a.*
from @t a
join(
select
商品名称,
min(价格*折扣) as col
from @t
group by 商品名称
)b
on b.商品名称 = a.商品名称
and b.col = a.价格 * a.折扣
/**
PY 业务 小红 苹果 50 0.50
PS 市场 小张 葡萄 50 0.50
**/
Row_number()over()函数
from (select rowid=row_number() over (order by 公司,部门,姓名,价格*折扣),* from ta) a
where rowid = 1