【问题标题】:Multiple complex queries with master select statement带有主选择语句的多个复杂查询
【发布时间】: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


【解决方案1】:

不是完整的答案,只是解释我的评论

类似的东西

    select sum(case when g.sexcode='F'and and ss.IsHold=1 then 1 else 0 end ) 'Female Hold',
    sum(case when g.sexcode='M'and ss.IsHold=1 then 1 else 0 end ) 'Male Hold',
   sum(case when g.sexcode='F'and and ss.IsFinal=1 and ss.code<>'PC' then 1 else 0 end ) 'Female Finalized'
--,....
    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

【讨论】:

  • 这对您有意义还是需要进一步的帮助?我想你可以从这里管理。告诉我
  • group by 应该被删除...以及尾随括号。
  • 改变了我的查询建模你的建议,我更喜欢它,因为空值是实际的 '0'。我喜欢这个 Horaciux!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2013-11-14
  • 1970-01-01
相关资源
最近更新 更多