SQL的ID计数

时间:2018-08-28 15:26:44

标签: sql sql-server

我有一个可去的CalendarDates表

Year Month MonthName Date
2017   1     Jan     2017-01-01 
2017   1     Jan     2017-01-02   ect 

我有companydetails表,是已注册客户的ID。

列为:     ID     加入公司日期     LeftCompanyDate(如果客户仍然加入公司,则可以为null)

日期格式化为示例2014-07-30 00:00:00.000

我需要写一个count(ID)的每月客户,例如2017年1月1日(每月开始),首先是WithTheCompany,还有多少人拥有LeftTheCompany

我试图与

Count (case when example.. with no joy 

Count (ID where example does not seem to work

任何创意团队?

请帮助

2 个答案:

答案 0 :(得分:0)

我将不得不做一个假设,由于混乱,您对日期格式的解释是(20170201、20170301等,如果没有解释,它们完全没有用:它们是2月1日和3月1日,还是1月2日和1月3日?他们当然没有格式化2014-07-30 00:00:00)。

我假设数据库中的基础数据类型是Date或DateTime。它实际上并没有以任何看起来像日期的“格式”存储:实用程序(如SSMS)选择显示它们,但是它们被编程为:对于SSMS,它采用YYYY-MM-DD HH-mm-ss.s格式。如果此假设不正确,并且将它们存储为某种类型的char(或vachar或nvarchar),则第一步是将其更改为Date或DateTime。未存储为日期类型的日期总是会流泪。

您对输出要求的解释也不清楚。我假设您想要一个月初的现有客户总数,以及上个月停止成为客户的客户数量。这可能不正确,但这就是我所假设的。

如下查询:

select 'Total' as 'Desc', count(*) as [count]
from tablename 
where JoinedCompaanyDate < '2018-08-1'
and LeftCompanyDate is null
union
select 'Left', count(*)
from tablename
where LeftCompanyDate >= '2018-07-1'
and LeftCompanyDate < '2018-08-1'

将给出:

Desc    Count    
Total   500    
Left    75

..在2018年8月1日开始时显示了500个现有客户,上个月有75个客户离开。

您可以将tat查询包装在Pivot中,以获得类似以下内容的信息:

Total  Left    
500    75

如果您希望这样做,请提出一个新问题。

答案 1 :(得分:0)

也许像年和月中所有加入者和离开者的完全加入。

示例:

-- Table variable for easy testing
declare @YourTable table (id int identity(1,1) primary key, JoinedCompanyDate datetime, LeftCompanyDate datetime);
-- Sample data
insert into @YourTable (JoinedCompanyDate, LeftCompanyDate) values
('2017-01-01T00:00:00', null),
('2017-01-02T00:00:00', '2017-01-02T00:00:00'), 
('2017-02-01T00:00:00', null),
('2017-02-02T00:00:00', '2017-02-03T00:00:00'), 
('2017-02-01T00:00:00', '2017-03-01T00:00:00'),
('2017-04-01T00:00:00', null);

-- Query
SELECT 
 COALESCE(Joiners.YearMonth, Leavers.YearMonth) AS YearMonth, 
 ISNULL(Joiners.Total,0) AS TotalJoined, 
 ISNULL(Leavers.Total,0) AS TotalLeft,
 SUM(ISNULL(Joiners.Total,0) - ISNULL(Leavers.Total,0)) OVER (ORDER BY COALESCE(Joiners.YearMonth, Leavers.YearMonth)) AS CumSumTotals
FROM
(
  SELECT 
   (YEAR(JoinedCompanyDate) * 100) +
   MONTH(JoinedCompanyDate) AS YearMonth,
   COUNT(*) AS Total
  FROM @YourTable
  WHERE JoinedCompanyDate IS NOT NULL
  GROUP BY YEAR(JoinedCompanyDate), MONTH(JoinedCompanyDate)
) AS Joiners
FULL JOIN 
(
  SELECT 
   (YEAR(LeftCompanyDate) *100) +
   MONTH(LeftCompanyDate) AS YearMonth,
   COUNT(*) AS Total
  FROM @YourTable
  WHERE LeftCompanyDate IS NOT NULL
  GROUP BY YEAR(LeftCompanyDate), MONTH(LeftCompanyDate)
) AS Leavers
ON Joiners.YearMonth = Leavers.YearMonth;