【问题标题】:most effecient way to perform this query without an out right join无需右连接即可执行此查询的最有效方法
【发布时间】:2013-07-22 09:40:52
【问题描述】:
CREATE TABLE [dbo].[TestSales](
[id] [int] IDENTITY(1,1) NOT NULL,
[saledate] date NULL,
[acct] varchar(20) NULL,
[Amt] [decimal](18,2) NULL
)
GO

insert into TestSales values('2013-07-20','Acct1',1000)
insert into TestSales values('2013-07-20','Acct1',2000)
insert into TestSales values('2013-07-20','Acct1',500)
insert into TestSales values('2013-08-2','Acct2',400)
insert into TestSales values('2013-08-2','Acct2',1000)
insert into TestSales values('2013-08-2','Acct2',1000)

select * from TestSales
declare @startDate date  = '2013-07-20',@endDate date = '2013-08-2'
select t1.acct,isnull(Rangesales,0) Rangesales,isnull(Monthsales,0)Monthsales   
from   (select acct,isnull(SUM(amt),0) as Rangesales from TestSales
where saledate between @startDate and @endDate
group by acct) as t1

left outer join
(select acct,isnull(SUM(amt),0) as Monthsales from TestSales
where  YEAR(saledate) = YEAR(@endDate) and month(saledate) = MONTH(@endDate)
group by acct) as t2 on
t1.acct = t2.acct

需要得到总数monthly sales for(@endDate) and total sales between(@startDate and @endDate).

在没有直接连接的情况下执行此查询的最佳方法是什么? 效率最高,尤其是当桌子变大时。

【问题讨论】:

  • 定义“真正的大”。另外,请发布实际的 SQL 语句,而不是包含它们的屏幕截图。
  • 所有实际的SQL语句都已经发布了......真正的大意味着当表变大时......也删除了截图。
  • 让我澄清一下我的问题:“大/真正大”有多大?我们是在谈论数千、数百万、数十亿行吗?
  • @FrankSchmitt 数千行。
  • 您使用的是哪个版本的 Sql Server?

标签: sql sql-server sql-server-2008 join


【解决方案1】:

将数据放在子查询中怎么样?

select acct, sum(Rangesales), sum(MonthSales) from 
  (select acct, 
       if(amt is null,0, amt) as Rangesales,  
       if (YEAR(saledate) = YEAR(@endDate) and month(saledate) = MONTH(@endDate), amt, 0) as        MonthSales
  from TestSales
  where saledate between @startDate and @endDate
) raw
group by acct

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2014-12-06
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多