我有两张表Customer
和Contacts
。
Companies
表包含有关客户的信息,当电子邮件发送给客户时,会在Contacts
表中创建一个联系人,其中包含有关发送哪种类型的电子邮件以及在何时发送的信息。
以下是一个例子:
Companies: Contacts:
------------------------ ----------------------------------------------
ID | Action ID | CompanyID | CreatedON | EmailType
----- | ---------------------- ----- | ---------- | --------- | ---------
Cus1 | 07.03.2014 Registered Con1 | Cus1 | 07.03.2014 | NewsLetter
Cus2 | 08.03.2014 UnSubscribe Con2 | Cus2 | 07.03.2014 | NewsLetter
Cus3 | 10.03.2014 Order Con3 | Cus3 | 10.03.2014 | NewsLetter
Cus4 | 10.03.2014 Registered Con4 | Cus4 | 10.03.2014 | NewsLetter
Cus5 | NULL Con5 | Cus5 | 14.03.2014 | NewsLetter
Cus6 | 15.03.2014 UnSubscribe Con6 | Cus6 | 14.03.2014 | NewsLetter
Cus7 | NULL Con7 | Cus7 | 17.03.2014 | NewsLetter
Cus8 | NULL Con8 | Cus8 | 17.03.2014 | NewsLetter
Cus9 | NULL Con9 | Cus9 | 17.03.2014 | NewsLetter
我正在寻找一个查询,这样我就可以在特定日期看到发送了多少封电子邮件以及有多少客户注册,取消订阅或预订了订单。
例如,当我运行以下查询时,我可以根据日期获得3月份发送的电子邮件数量:
Select Left(convert(date, CreatedON, 105),12) AS DATE_Sent,
count ( CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) ) as Alle
From Contacts
Where Contacts.Comment Like 'Newsletter' and
( CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) >= '01.03.2014' and
CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) <= '30.03.2014')
Group by Left(convert(date, CreatedON, 105),12)
Order by DATE_Sent
我可以通过此查询获得3月份注册的用户数量:
SELECT Count(Companies.ID) as NumOfRegistered
FROM Companies, Contacts
Where Companies.ID = Contacts.CompanyID and Contacts.Comment Like 'Newsletter' And
( Companies.Action Like '%Registered%') And
(Right(Companies.Action, 10) Like '%03.2014'
Group By Right(Companies.Action, 10)
同样为什么我可以在3月份获得UnSubscried或Ordered的用户。
我得到了单独的结果,我不知道如何将这些小查询结合起来,以便我可以在日期明智地看到所有结果。任何帮助将非常感激。我期待查询给出以下结果:
Date | Alle | Registered | Unsubscribe | Order |
---------- ---- ---------- ---------- -----
07.03.2014 | 2 | 1 | NULL | NULL
10.03.2014 | 2 | 1 | NULL | 1
14.03.2014 | 2 | NULL | NULL | NULL
17.03.2014 | 3 | NULL | NULL | NULL
答案 0 :(得分:2)
试试这个
Select DATE_Sent,Alle,NumOfRegistered
from (
(Select CompanyID as id, Left(convert(date, CreatedON, 105),12) AS DATE_Sent, count ( CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) ) as Alle
From Contacts
Where Contacts.Comment Like 'Newsletter' and
( CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) >= '01.03.2014' and CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, CreatedON))) <= '30.03.2014')
Group by Left(convert(date, CreatedON, 105),12),CompanyID
Order by DATE_Sent) As query1
Left outer Join
(SELECT Companies.ID as id1,Count(Companies.ID) as NumOfRegistered
FROM Companies, Contacts
Where Companies.ID = Contacts.CompanyID and Contacts.Comment Like 'Newsletter' And
( Companies.Action Like '%Registered%') And
(Right(Companies.Action, 10) Like '%03.2014'
Group By Right(Companies.Action, 10),Companies.ID) as query2
on query1.id=query2.id1)
EDIT ---------------------------------------------- -------------------------------------
来自Gordon的回复..更改查询以避免Null
并替换为0
select thedate,
Case when Alle=NULL then 0 else sum(Alle) as col1,
Case when NumOfRegistered=NULL then 0 else sum(NumOfRegistered) as col2,
Case when NumOfUnsubscribed=NULL then 0 else sum(NumOfUnsubscribed) as col3,
Case when NumOfOrdered=NULL then 0 else sum(NumOfOrdered) as col4
from ((SELECT convert(date, left(co.Action 10), 104) as thedate, NULL as Alle
SUM(case when co.Action Like '%Registered%' then 1 else 0 end) as NumOfRegistered,
SUM(case when co.Action Like '%Unsubscribed%' then 1 else 0 end) as NumOfUnsubscribed,
SUM(case when co.Action Like '%Ordered%' then 1 else 0 end) as NumOfOrdered,
FROM Companies co
GROUP BY convert(date, left(co.Action 10), 104)
) union all
(select convert(date, CreatedON, 105) as DATE_Sent, count(*) as Alle, NULL, NULL, NULL
from Contacts c
where c.Comment Like 'Newsletter' and
substring(c.CreatedOn, 4, 7) = '03.2014'
group by convert(date, CreatedON, 105)
)
) t
group by thedate
order by thedate;
答案 1 :(得分:2)
从companies
表中获取数字将使用条件聚合:
SELECT convert(date, left(co.Action 10), 104) as date
SUM(case when co.Action Like '%Registered%' then 1 else 0 end) as NumOfRegistered,
SUM(case when co.Action Like '%Unsubscribed%' then 1 else 0 end) as NumOfUnsubscribed,
SUM(case when co.Action Like '%Ordered%' then 1 else 0 end) as NumOfOrdered,
FROM Companies co
GROUP BY convert(date, left(co.Action 10), 104);
您可以从联系人表格中获取数字:
select convert(date, CreatedON, 105) as DATE_Sent, count(*) as Alle
from Contacts c
where c.Comment Like 'Newsletter' and
substring(c.CreatedOn, 4, 7) = '03.2014'
group by convert(date, CreatedON, 105) ;
您可以使用union all
和aggregation
select thedate, sum(Alle), sum(NumOfRegistered), sum(NumOfUnsubscribed), sum(NumOfOrdered)
from ((SELECT convert(date, left(co.Action 10), 104) as thedate, NULL as Alle
SUM(case when co.Action Like '%Registered%' then 1 else 0 end) as NumOfRegistered,
SUM(case when co.Action Like '%Unsubscribed%' then 1 else 0 end) as NumOfUnsubscribed,
SUM(case when co.Action Like '%Ordered%' then 1 else 0 end) as NumOfOrdered,
FROM Companies co
GROUP BY convert(date, left(co.Action 10), 104)
) union all
(select convert(date, CreatedON, 105) as DATE_Sent, count(*) as Alle, NULL, NULL, NULL
from Contacts c
where c.Comment Like 'Newsletter' and
substring(c.CreatedOn, 4, 7) = '03.2014'
group by convert(date, CreatedON, 105)
)
) t
group by thedate
order by thedate;
一些课程:
join
语法,其中条件位于on
子句而不是where
子句中。