0

我有这个演示数据库

create database testGroupfirst22;
go

use testGroupfirst22;
go

create table testTbl 
(
    id int primary key identity,
    custnum nvarchar(50),
    transDate datetime,
    degree int 
)

insert into testTbl 
values ('ahmed', '1-1-2000', 50), ('ahmed', '1-1-2000', 500),
       ('ahmed', '2-1-2000', 660), ('ahmed', '2-1-2000', 666),
       ('ahmed', '3-1-2000', 50),
       ('ali', '1-1-2000', 5054), ('ali', '1-1-2000', 1500),
       ('ali', '1-1-2000', 66220), ('ali', '1-1-2000', 6656),
       ('ali', '1-1-2000', 540),
       ('hasan', '1-1-2000', 50), ('hasan', '1-1-2000', 50),
       ('hasan', '1-1-2000', 500), ('hasan', '1-1-2000', 660),
       ('hasan', '1-1-2000', 666), ('hasan', '1-1-2000', 50)

这是输出

在此处输入图像描述

我编写这段代码是为了在超过 1950 年的指定时间内获取所有交易,它的工作原理是这样的

select 
    custnum, sum(degree) as [all transaction] 
from 
    testTbl
where 
    transdate between '1-1-2000' and '3-1-2000' 
group by 
    custnum
having 
    sum(degree) > 2000

输出:

在此处输入图像描述

但我需要用这样的相同代码列出所有这些交易和它的历史

在此处输入图像描述

我相信使用子查询可能会发生这种情况,但我认为使用它会出现性能问题,我发现很多问题建议使用交叉应用和其他窗口 - 排名,但我不熟悉这些方式,我被困住了查询,我还无法找到赖特解决方案。

4

1 回答 1

1

我一秒钟都不会相信将其放入子查询中会出现性能问题。

就像是

SELECT *
FROM testTbl
WHERE custnum IN
    (
        SELECT custnum
        FROM testTbl
        WHERE transdate BETWEEN '1-1-2000'  AND '3-1-2000'
        GROUP BY custnum
        HAVING sum(degree) > 2000
    )

custnum 上的索引,您在这里应该没问题。

于 2018-04-16T21:04:37.327 回答