ash*_*ash 6 sql sql-server sql-server-2008
出于某种原因,我对此感到困惑.
基本上,我正在寻找一个查询,可以找到自2010年以来每月新客户的数量.
我有客户的电子邮件地址(电子邮件),所有下订单(OrderID),以及它所在的日期(OrderDate).该表是tblOrder.
我知道"新客户"是:(a)在日期/月之前从未订购的人和(b)在日期/月之后至少有一个订单的人
我希望输出最终是这样的,更简单的方法更好:
01 02 03 04 05 06 07 08 09 10 11 12
2010 ## ## ## ## ## ## ## ## ## ## ## ##
2011 ## ## ## ## ## ## ## ## ## ## ## ##
2012 ## ## ## ## ## ## ## ## ## ## ## ##
Run Code Online (Sandbox Code Playgroud)
我得到了这个,但是伙计们,我真的不是一个程序员,而且你们可能看起来很简单,但这些都超出了我的想法而根本没有点击我.
SELECT <customer info>
FROM <customer table>
WHERE (SELECT COUNT(<order info>)
FROM <order table>
WHERE <customer info> = <current customer>
AND <date> < <target date>) = 0
AND (SELECT COUNT(<order info>
FROM <order table>
WHERE <customer info> = <current customer>
AND <date> > <target date>) > 0
Run Code Online (Sandbox Code Playgroud)
我知道这也不是有效的SQL.所以我不知道该怎么做.而且我认为它只是提取了一个适用客户列表(意思是那些在输入的月份之前没有订购的客户),而不是将它们全部计算在内,并像我最终想要的那样累计它们.
小智 2
尝试:
select yr, [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]
from
(select datepart(month,minDate) mth, datepart(year,minDate) yr, count(*) cnt
from (select min(OrderDate) minDate, max(OrderDate) maxDate
from tblOrder
group by email) sq
where datediff(month, minDate, maxDate) > 0
group by datepart(month,minDate), datepart(year,minDate)) src
PIVOT
(max(cnt)
for mth in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) ) pvt
Run Code Online (Sandbox Code Playgroud)
SQLFiddle在这里。