【问题标题】:Counting Rows where one row contains some data and other row another data计数行,其中一行包含一些数据,另一行包含另一个数据
【发布时间】:2014-05-21 04:29:03
【问题描述】:

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

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 做到这一点?

谢谢 萨默斯

【问题讨论】:

  • 如果我是你,想想新的一年会以无情的方式出现,我会规范化我的数据。

标签: sql sql-server


【解决方案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

【讨论】:

  • 这很好。然而,还有一件事我忘了提。可能有更多的表单类型。比如 1, 2, 3, 4, 5。我们只需要考虑 Formtype=4 AND formtype=5 是否可用,然后只考虑 Formtype=4 并忽略 Formtype=5 (但仍然计算其他表单类型)。简而言之,所有表单类型都被计算在内(可能从 1 到 7),但如果可用 4 和 5,则忽略 5 并仅考虑 4。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 2015-10-20
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多