关于SQL Server查询语句向大神
关于SQL Server查询语句向大神求助

有三张表,表结构如图,第一张表为表A,第二张表为B,第三张表为C。表A中userId和表C中userID对应,ModuleId和表B 中id对应,
要求:1.只统计关键模块,2按月统计每一天的访问情况
这个SQL语句该怎么写,有存储过程更好,,,
大神求助啊。。。
------解决思路----------------------
直接仨表连接 group by 月就行
如果月不全 就先用master..spt_values中的number 生成一个月的列
------解决思路----------------------
何为“关键模块”?
------解决思路----------------------
用哪个字段来标识关键模块?
3表连接查询
而且你的测试数据给得实在是太少了 建议用文本方式给出。
------解决思路----------------------
1#楼的思路可以,而且比我这个好。但现实中许多编程序写代码更倾向于用 游标+临时表。因为那样调整起来方便。
给你一个创建动态时间列,和游标循环的事例,仅做参考
动态时间列
游标
------解决思路----------------------
这样?
有三张表,表结构如图,第一张表为表A,第二张表为B,第三张表为C。表A中userId和表C中userID对应,ModuleId和表B 中id对应,
要求:1.只统计关键模块,2按月统计每一天的访问情况
这个SQL语句该怎么写,有存储过程更好,,,
大神求助啊。。。
------解决思路----------------------
直接仨表连接 group by 月就行
如果月不全 就先用master..spt_values中的number 生成一个月的列
------解决思路----------------------
何为“关键模块”?
------解决思路----------------------
用哪个字段来标识关键模块?
3表连接查询
而且你的测试数据给得实在是太少了 建议用文本方式给出。
------解决思路----------------------
1#楼的思路可以,而且比我这个好。但现实中许多编程序写代码更倾向于用 游标+临时表。因为那样调整起来方便。
给你一个创建动态时间列,和游标循环的事例,仅做参考
动态时间列
DECLARE @StartDate CHAR(10)='2014-02-01'
DECLARE @EndDate CHAR(10) ='2014-02-28'
DECLARE @Dates DATETIME = CAST(@StartDate AS DATETIME)
DECLARE @CreateTableSql NVARCHAR(4000)
IF OBJECT_ID('tempdb..#Test','U') IS NOT NULL DROP TAbLE #Test
CREATE TABLE #Test
(
DpartID INT
)
WHILE @Dates<=CAST(@EndDate AS DATETIME)
BEGIN
PRINT CONVERT(CHAR(7),@Dates,120)
SET @CreateTableSql = N'ALTER TABLE #Test ADD ['+CONVERT(varchar(10),@Dates,23)+'] VARCHAR(20) NULL'
EXEC (@CreateTableSql)
SET @Dates=DATEADD(day,1,@Dates)
END
SELECT * FROM #Test
游标
if object_id('[TB]') is not null drop table [TB]
create table [TB](ld_P INT,LastName varchar(50),FirstName varchar(50),Address varchar(50),City VARCHAR(50))
insert into [TB]
select 1,'1',NULL,NULL,'bvv' union all
select 2,'4',NULL,NULL,'bvv' union all
select 3,'8',NULL,NULL,'bvv' union all
select 4,'12',NULL,NULL,'bvv' union all
select 5,'22',NULL,NULL,'222'
GO
select * from [TB]
go
DECLARE @str VARCHAR(50)
----------------------开始--------------------
BEGIN TRY
BEGIN TRAN
DECLARE test CURSOR FOR SELECT LastName FROM dbo.TB
OPEN test
FETCH NEXT FROM test INTO @str
WHILE (@@fetch_status=0)
BEGIN
PRINT @str --取出LastName给变量
FETCH NEXT FROM test INTO @str
END
CLOSE test
DEALLOCATE test
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN
END CATCH
---------------------结束--------------------
------解决思路----------------------
这样?
CREATE PROCEDURE P1
(
@StartDate DATETIME--'每月1号:2014-01-01'
,@ModuleID INT --关健模块ID
)
AS
SET nocount ON ;
DECLARE @EndDate DATETIME
SET @EndDate = DATEADD(mm, 1, @StartDate)
SELECT A.*
,b.Name
,c.UserName
FROM A
INNER JOIN B ON A.ModuleID = b.ID
INNER JOIN C ON A.UserID = C.UserID
WHERE a.CreatedDate >= @StartDate
AND a.CreatedDate < @EndDate
AND A.ModuleID = @ModuleID