【发布时间】:2016-02-02 18:48:11
【问题描述】:
所以,我试图找到这个查询的示例,看看它是否优雅或者是否有更好的方法,但我在任何地方都没有找到任何这样的示例。它可以工作,并且在中小型数据库上运行得相当快,但我只是不知道是否有更好/更快的方法来完成此查询。
有什么改进的建议吗?
select
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='F'
and ss.IsHold=1
group by g.SexCode) 'Female Hold',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.cugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='M'
and ss.IsHold=1
group by g.SexCode) 'Male Hold',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='F'
and (ss.IsFinal=1 and ss.code<>'PC')
group by g.SexCode) 'Female Finalized',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='M'
and (ss.IsFinal=1 and ss.code<>'PC')
group by g.SexCode) 'Male Finalized',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='F'
and (ss.IsOrdered=1 and ss.code='PC')
group by g.SexCode) 'Female Ordered',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='M'
and (ss.IsOrdered=1 and ss.code='PC')
group by g.SexCode) 'Male Ordered',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='F'
and ss.IsApproved=1
group by g.SexCode) 'Female Approved',
(select count(b.bookingnbr) from Customer as cu
inner join Sales as b on b.CugFK=cu.NameID
inner join Gender as g on cu.SexID=g.SexCodeID
inner join SalesOrderHistory as ssh on ssh.SalesFK=b.SalesPK
inner join OrderStatus as ss on ss.OrderStatusID=ssh.OrderStatusFK
where b.SalesDtTm between '01/01/2015 00:00:00' and '12/31/2015 23:59:00'
and ssh.DeletedDtTm is null
and g.sexcode='M'
and ss.IsApproved=1
group by g.SexCode) 'Male Approved'
【问题讨论】:
-
是的,有。你知道/使用过
CASE WHEN吗? -
不在 SQL 中,对 SQL 来说相当新。我会调查案例声明,谢谢!
-
我建议为您的列别名使用双引号(或方括号)。
-
我见过人们这样做,我确信这是有充分理由的,只是我不知道为什么。编辑:这说括号是不可移植的:stackoverflow.com/questions/19657101/…
-
请不要陷入寻找优雅SQL代码的陷阱。您希望 SQL 代码首先给出正确的结果,然后执行良好。优雅的代码往往会完全忽略第二点。看起来最差的 SQL 通常是最好的选择。
标签: sql sql-server tsql case-when