Sql 在同一列中查询3个不同的值

Sql 在同一列中查询3个不同的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在努力以我需要的格式提取数据,但直到现在都没有成功 我有下表 身份证、日期证、办公室证、身份证 我需要将查询返回给我,每个月,并且始终是同一办公室的查询: 任何状态下的票证数量都会计算 状态为5的票证数量计数 状态为6的票证数量计数 月 年 我只返回具有任何状态的票证总数的查询是这样的。成功了 SELECT COUNT (id_ticket) as TotalTicketsPerMonth, 'sYear' = YEAR (date_ticket), 'sMonth' = MONTH (da

我正在努力以我需要的格式提取数据,但直到现在都没有成功

我有下表

身份证、日期证、办公室证、身份证

我需要将查询返回给我,每个月,并且始终是同一办公室的查询:

任何状态下的票证数量都会计算 状态为5的票证数量计数 状态为6的票证数量计数 月 年 我只返回具有任何状态的票证总数的查询是这样的。成功了

SELECT
COUNT (id_ticket) as TotalTicketsPerMonth,
'sYear' = YEAR (date_ticket),
'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1
GROUP BY
YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC
返回状态为5的票证总金额

SELECT
COUNT (id_ticket) as TotalTicketsPerMonth,
'sYear' = YEAR (date_ticket),
'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1 AND status_ticket = 5
GROUP BY
YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC
但我需要的回报是:

Year Month Total Status5 Status6
2018   1     15      5        3

2018   2     14      4        5

2018   3     19      2        8

谢谢你的帮助。

离你很近了。您可以使用大小写表达式来获取所需内容:

SELECT
    COUNT (id_ticket) as TotalTicketsPerMonth,
    SUM(CASE WHEN status_ticket = 5 THEN 1 END) as Status5,
    SUM(CASE WHEN status_ticket = 6 THEN 1 END) as Status6,
    'sYear' = YEAR (date_ticket),
    'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1
GROUP BY YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC

下面的代码基于JNevill的答案构建,以包括缺少月份的摘要行,即没有票证的月份以及有票证的月份。其基本思想是创建从第一张票据到最后一张票据的所有月份的表,将票据数据与月份连接起来,然后汇总数据。理货表、数字表和日历表或多或少都是适用的术语

它是一个常见的表表达式CTE,其中包含多个查询,这些查询逐步向结果前进。通过将最终select语句替换为上面注释掉的语句之一,可以看到中间步骤的结果

-- Sample data.
declare @crm_vw_Tickets as Table ( id_ticket Int Identity, date_ticket Date, office_ticket Int, status_ticket Int );
insert into @crm_vw_Tickets ( date_ticket, office_ticket, status_ticket ) values
  ( '20190305', 1, 6 ), -- Shrove Tuesday.
  ( '20190501', 1, 5 ), -- May Day.
  ( '20190525', 1, 5 ); -- Towel Day.
select * from @crm_vw_Tickets;

-- Summarize the data.
with
  -- Get the minimum and maximum ticket dates for   office_ticket   1.
  Limits as (
    select Min( date_ticket ) as MinDateTicket, Max( date_ticket ) as MaxDateTicket
      from @crm_vw_Tickets
      where office_ticket = 1 ),
  -- 0 to 9.
  Ten ( Number ) as ( select * from ( values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) ) as Digits( Number ) ),
  -- 100 rows.
  TenUp2 ( Number ) as ( select 42 from Ten as L cross join Ten as R ),
  -- 10000 rows.  We'll assume that 10,000 months should cover the reporting range.
  TenUp4 ( Number ) as ( select 42 from TenUp2 as L cross join TenUp2 as R ),
  -- 1 to the number of months to summarize.
  Numbers ( Number ) as ( select top ( select DateDiff( month, MinDateTicket, MaxDateTicket ) + 1 from Limits ) Row_Number() over ( order by ( select NULL ) ) from TenUp4 ),
  -- Starting date of each month to summarize.
  Months as (
    select DateAdd( month, N.Number - 1, DateAdd( day, 1 - Day( L.MinDateTicket ), L.MinDateTicket ) ) as StartOfMonth
      from Limits as L cross join
        Numbers as N ),
  -- All tickets assigned to the appropriate month and a row with NULL ticket data
  --   for each month without tickets.
  MonthsAndTickets as (
    select M.StartOfMonth, T.*
      from Months as M left outer join
        @crm_vw_Tickets as T on M.StartOfMonth <= T.date_ticket and T.date_ticket < DateAdd( month, 1, M.StartOfMonth ) )
  -- Use one of the following   select   statements to see the intermediate or final results:
  --select * from Limits;
  --select * from Ten;
  --select * from TenUp2;
  --select * from TenUp4;
  --select * from Numbers;
  --select * from Months;
  --select * from MonthsAndTickets;
  select Year( StartOfMonth ) as SummaryYear, Month( StartOfMonth ) as SummaryMonth,
    Count( id_ticket ) as TotalTickets,
    Coalesce( Sum( case when status_ticket = 5 then 1 end ), 0 ) as Status5Tickets,
    Coalesce( Sum( case when status_ticket = 6 then 1 end ), 0 ) as Status6Tickets
    from MonthsAndTickets
    where office_ticket = 1 or office_ticket is NULL -- Handle months with no tickets.
    group by StartOfMonth
    order by StartOfMonth;

请注意,最终选择使用Count id_ticket、Coalesce和显式检查NULL来为没有ticket的月份生成适当的输出值0。

谢谢JNevill!就在现场!救了我一天!预测您将希望每个月有一行,即使没有该年/月/办公室组合的门票。也许我会!:我怎样才能解决这个问题?有什么想法吗?哇!谢谢你,哈波!我需要花一些时间来理解你的代码,因为我是一个基本级别的用户。让我们开始吧!