我有一个可去的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
任何创意团队?
请帮助
答案 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;