Sql server SQL Server:两个日期之间的数据

Sql server SQL Server:两个日期之间的数据,sql-server,join,range,Sql Server,Join,Range,考虑到有两个日期,如2012-07-08和2013-02-06。我需要每个月统计每个用户的记录。如果某个月没有用户的数据,那么它应该返回零。输出应该如下所示:- id name July-12 August-12 September-12 October-12 November-12 December-12 January-13 February-13 1 John 1 2 0 0 1 1

考虑到有两个日期,如2012-07-08和2013-02-06。我需要每个月统计每个用户的记录。如果某个月没有用户的数据,那么它应该返回零。输出应该如下所示:-

id name   July-12 August-12 September-12 October-12 November-12 December-12 January-13 February-13
1  John      1        2          0            0         1           1           2      2    
2  David     0        1          0            1         1           1           2      2
3  Marry     2        1          0            0         0           1           2      2
如果是日期,则不能使用BETWEEN,即使BETWEEN包含在内。 对于这种情况,最好使用

startdate>='2012-07-08 ' and enddate<=2013-02-06
编辑

在上面的查询中使用pivot,您可以获得问题中的确切结果

希望您需要以下函数来填充给定条件之间的所有日期,并且您可能需要使用旋转来完成任务

执行:从数据库中选择*获取日期'2012-07-08','2013-02-06'


您可以使用中间运算符,例如。。从tableName中选择count*,其中createdate在“2012-07-08”和“2013-02-06”之间按ColumnName分组我尝试过此操作,但它排除了某些月份内没有数据的用户记录。但我想包括每个用户的所有月份。如果在那个月没有用户的数据,那么它应该返回0。你可以考虑自加入是一种关系。如果你想让我写查询,我可以知道你的模式吗:谢谢你,但你似乎没有仔细阅读我的问题。通过应用上述条件,您无法获得当月记录不存在的用户的数据。。。我需要将这两个日期拆分为月份。在上面的示例中,datename是什么?系统函数。这将返回给定日期的月份名称作为第一个参数。请通过更新解决方案提供整个存储过程。确定。让我知道您在哪里进行用户计数的表?
DECLARE @temp AS TABLE(Month_Name varchar(25),ContactName varchar(50)) -- newly added

;WITH cte
AS 
(
     SELECT datename(month, @startdate) AS [Month_Name], @startdate AS dat
UNION ALL
     SELECT datename(month, DateAdd(Month, 1, dat)), DateAdd(Month, 1, dat) 
     FROM cte
     WHERE DateAdd(Month, 1, dat) < @enddate

)

INSERT INTO @temp
SELECT c.Month_Name,Cs.username
FROM cte c  CROSS JOIN usertbale Cs
ORDER BY c.Month_Name

SELECT c.Month_Name,c.username,ISNULL(tt.coun,0) as coun
FROM @temp c LEFT JOIN
(
    SELECT  datename(month,OrderDate) AS month_Name
           ,count(OrderID) as coun
           ,ContactName
    FROM tblpublisher p INNER JOIN tbluser  u ON u.userid=p.userid
    GROUP BY month_Name,datename(month,publishdate)
) as tt 
ON c.Month_Name=tt.month_Name AND c.username=tt.username
CREATE FUNCTION [dbo].[GetDates](@StartDate DATETIME, @EndDate DATETIME)
RETURNS TABLE AS
RETURN (
WITH 
 N0 AS (SELECT 1 AS N UNION ALL SELECT 1)
,N1 AS (SELECT 1 AS N FROM N0 T1, N0 T2)
,N2 AS (SELECT 1 AS N FROM N1 T1, N1 T2)
,N3 AS (SELECT 1 AS N FROM N2 T1, N2 T2)
,N4 AS (SELECT 1 AS N FROM N3 T1, N3 T2)
,N5 AS (SELECT 1 AS N FROM N4 T1, N4 T2)
,N6 AS (SELECT 1 AS N FROM N5 T1, N5 T2)
,NUMS AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS NUM FROM N6)
SELECT CAST(DATEADD(day,num-1,@StartDate) AS Date) as TheDate
FROM NUMS 
WHERE NUM <= DATEDIFF(day,@StartDate,@EndDate) + 1
);