sql中的总计计数

sql中的总计计数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张表,如下所示,我想计算一下发给每个董事会的票数 Title No_ticket Directorate1 Direcotorate2 Direcotorate3 Direcotorate4 Direcotorate5 Conference 2 Marketing Finance Training 2 IT Finance

我有一张表,如下所示,我想计算一下发给每个董事会的票数

      Title    No_ticket    Directorate1     Direcotorate2  Direcotorate3    Direcotorate4   Direcotorate5 
   Conference   2           Marketing            Finance
      Training  2               IT               Finance
      Training  2               IT               Marketing
我想把输出看作

 Directorate  Total ticket 
  Marketing       2
    IT            2
   Finance        2
我怎样才能做到这一点。在此方面的任何帮助都将不胜感激

我的剧本是

select Count(t.no_ticket),directorate1 
from #ticketbooking t
group by t.no_ticket,directorate1

union

select Count(t.no_ticket),directorate2 
from #ticketbooking t
group by t.no_ticket,directorate2

这并不能满足我的需要

您可以尝试使用union all和subquery

select Directorate ,count(*) as [Total ticket]
from
(
   select Directorate1 as Directorate from tablename where Directorate1  is not null
   union all
   select Directorate2 from tablename where Directorate2  is not null
   union all
   select Directorate3 from tablename where Directorate3  is not null
   union all
   select Directorate4 from tablename where Directorate4  is not null
   union all
   select Directorate5 from tablename where Directorate5  is not null
)A group by Directorate 

我建议使用
交叉应用

select v.directorate, Count(t.no_ticket) as total_tickets
from #ticketbooking t cross apply
     (values (t.directorate1), (t.directorate2)) v(directorate)
where v.directorate is not null
group by v.directorate;

在对其他问题的评论中,您指出每个董事会只获得一张票,实际上有五个董事会专栏

我将假设如果没有第五董事会,则该列包含空值。这就引出了下面查询中的
WHERE
子句

SELECT
    Directorate, COUNT(*) AS ticket_allocation
FROM
(
    SELECT directorate1 AS directorate FROM yourTable WHERE directorate1 IS NOT NULL
    UNION ALL
    SELECT directorate2 AS directorate FROM yourTable WHERE directorate2 IS NOT NULL
    UNION ALL
    SELECT directorate3 AS directorate FROM yourTable WHERE directorate3 IS NOT NULL
    UNION ALL
    SELECT directorate4 AS directorate FROM yourTable WHERE directorate4 IS NOT NULL
    UNION ALL
    SELECT directorate5 AS directorate FROM yourTable WHERE directorate5 IS NOT NULL
)
    AS pivotted
GROUP BY
    directorate
或者


为什么答案总是2?对我来说应该是4。。。请用英语或伪代码解释您希望以何种方式处理示例数据以达到示例输出。这是Directorate1和Directorate2的唯一组合吗?您目前的问题无法回答,因为你没有明确说明你想要实现什么。另一个关于答案的评论说,
no_ticket
意味着
two ticket
,它们分布在所示的董事会之间。如果有3张票怎么办?每张1.5张票?第一董事会2人,第二董事会1人?或者反之亦然?@Tobb看看我已经收到的答案。如果
no_ticket
表示id,如果是ticket,你不应该计算不同的值吗?如果它指的是票数,你不应该求和吗?OP没有解释所需的业务逻辑,所以您已经假设了,我强烈推荐您假定的业务逻辑。@ MatBailie,我没有考虑Noi票在这里,因为它也让我感到困惑。Directorate2@fa06完美的老板。这就是我想要的。这不是总数,而是计数。当车票数量为2时,表示每人有一张车票。谢谢,如果您感到困惑,您正在忽略数据并发布一条随机sql语句,这可能与所需逻辑有关,也可能与所需逻辑无关。@biswa-不要称我或其他人为“老板”,贬低自己。你比这更好,我们当然不值得。OP的评论(关于答案而不是问题)现在使董事会专栏可以为空,其中有5个。
SELECT
    pivotted.directorate, COUNT(*) AS ticket_allocation
FROM
    yourTable
CROSS APPLY
(
    SELECT yourTable.directorate1 WHERE yourTable.directorate1 IS NOT NULL  
    UNION ALL
    SELECT yourTable.directorate2 WHERE yourTable.directorate2 IS NOT NULL  
    UNION ALL
    SELECT yourTable.directorate3 WHERE yourTable.directorate3 IS NOT NULL  
    UNION ALL
    SELECT yourTable.directorate4 WHERE yourTable.directorate4 IS NOT NULL  
    UNION ALL
    SELECT yourTable.directorate5 WHERE yourTable.directorate5 IS NOT NULL  
)
    AS pivotted(directorate)
GROUP BY
    pivotted.directorate