计算行,其中一行包含一些数据,另一行包含另一个数据

时间:2014-05-20 18:52:02

标签: sql sql-server

我有一个包含以下字段的简单表格(其中很少)

CustomerID,OrderNumber,TaxYear2013,TaxYear2012,TaxYear2011,FormType(以及其他一些字段)。

一位客户可能已请求不同的表格类型(税务明细)。所以数据可能就像这样

Customer#     Order#       TaxYear2013    TaxYear2012    TaxYear2010    FormType
1111          100          True           True           True            4
1111          101          True           True           True            5
2222          102          True           False          True            4
3333          103          True           False          True            4

我需要使用以下条件的订单数量(Count(Order#))。 如果任何TaxYear为真,则将其计为一。 (这意味着,第一行将具有3 +第二行= 3 +第三行= 2 +第四行= 2)。 所以目前有10个订单(每年计数一个)。

这很简单,我使用此查询计算。

SELECT
(SELECT Count(OrderNumber) From tblOrder Where TaxYear2013 =1 )
+
(SELECT Count(OrderNumber) From tblOrder Where TaxYear2012 =1 )
+
(SELECT Count(OrderNumber) From tblOrder Where TaxYear2011 =1 )
+
(SELECT Count(OrderNumber) From tblOrder Where TaxYear2010 =1 )
as TotalYearsOrdered

但是,我需要根据FormType过滤掉一行中的记录并从另一行中计数。

如果formType = 4且formType = 5,则仅计算FormType = 4的订单(基于上述查询),并忽略同一客户的FormType = 5的行。但如果没有FormType = 4的行,则按原样计算。

基于以上数据,我们应该忽略第2行,因为同一客户的FormType = 5和4(所以我们只应该考虑FormType = 4的行中的数据)。

有没有简单的方法可以通过SQL做到这一点?

感谢    Sameers

1 个答案:

答案 0 :(得分:1)

这个SQL:

select *
    , (y.TaxYear2013+y.TaxYear2012+y.TaxYear2010) as OrderCount
from (
    select *
        , (select top 1 TaxYear2013 from taxes t2 where t2.customerNo = z.customerNo order by formtype) as TaxYear2013
        , (select top 1 TaxYear2012 from taxes t2 where t2.customerNo = z.customerNo order by formtype) as TaxYear2012
        , (select top 1 TaxYear2010 from taxes t2 where t2.customerNo = z.customerNo order by formtype) as TaxYear2010
    from (
        select distinct customerNo 
        from taxes t
        ) z
    ) y

将产生此输出:

customerNo  TaxYear2013 TaxYear2012 TaxYear2010 OrderCount
1111        1           1           1           3
2222        1           0           1           2
3333        1           0           1           2

这是我的测试数据库设置:

use tryme
GO
drop table taxes
go
create table taxes (
    id int identity(1,1) primary key
    , customerNo int 
    , OrderNo       int
    , TaxYear2013   int
    , Taxyear2012   int
    , taxyear2010   int
    , formtype      int
)
GO
insert into taxes (customerNo, OrderNo, TaxYear2013, Taxyear2012, taxyear2010, formtype) values (1111,100,1,1,1,4)
insert into taxes (customerNo, OrderNo, TaxYear2013, Taxyear2012, taxyear2010, formtype) values (1111,101,1,1,1,5)
insert into taxes (customerNo, OrderNo, TaxYear2013, Taxyear2012, taxyear2010, formtype) values (2222,103,1,0,1,4)
insert into taxes (customerNo, OrderNo, TaxYear2013, Taxyear2012, taxyear2010, formtype) values (3333,104,1,0,1,4)
GO
select * from taxes

如果这不能解决您的问题,请告诉我。

RosSQL.BlogSpot.com