【问题标题】:INNER JOIN code calculated value with SELECT statement使用 SELECT 语句的 INNER JOIN 代码计算值
【发布时间】:2012-04-05 21:53:59
【问题描述】:

我有以下存储过程,它将生成 mon 到 sun,然后创建一个包含一系列“周”(开始和结束周)的临时表:

USE [test_staff]
GO

/****** Object:  StoredProcedure [dbo].[sp_timesheets_all_staff_by_week_by_job_grouping_by_site]    Script Date: 03/21/2012 09:04:49 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE PROCEDURE [dbo].[sp_timesheets_all_staff_by_week_by_job_grouping_by_site]
    (
    @grouping_ref int,
    @week_ref int 
    )
AS

CREATE TABLE #WeeklyList
(
    Start_Week date, 
    End_Week date,
    week_ref int
    --month_name date
)


DECLARE @REPORT_DATE DATETIME, @WEEK_BEGINING VARCHAR(10)
SELECT @REPORT_DATE = '2011-01-19T00:00:00'
--SELECT @REPORT_DATE = GETDATE() -- should grab the date now.
SELECT @WEEK_BEGINING = 'MONDAY'
IF @WEEK_BEGINING = 'MONDAY'
SET DATEFIRST 1
ELSE IF @WEEK_BEGINING = 'TUESDAY'
SET DATEFIRST 2
ELSE IF @WEEK_BEGINING = 'WEDNESDAY'
SET DATEFIRST 3
ELSE IF @WEEK_BEGINING = 'THURSDAY'
SET DATEFIRST 4
ELSE IF @WEEK_BEGINING = 'FRIDAY'
SET DATEFIRST 5
ELSE IF @WEEK_BEGINING = 'SATURDAY'
SET DATEFIRST 6
ELSE IF @WEEK_BEGINING = 'SUNDAY'
SET DATEFIRST 7
DECLARE @WEEK_START_DATE DATETIME, @WEEK_END_DATE DATETIME
--GET THE WEEK START DATE
SELECT @WEEK_START_DATE = @REPORT_DATE - (DATEPART(DW, @REPORT_DATE) - 1)
--GET THE WEEK END DATE
SELECT @WEEK_END_DATE = @REPORT_DATE + (7 - DATEPART(DW, @REPORT_DATE))
PRINT 'Week Start: ' + CONVERT(VARCHAR, @WEEK_START_DATE)
PRINT 'Week End: ' + CONVERT(VARCHAR, @WEEK_END_DATE)

DECLARE @Interval int = datediff(WEEK,getdate(),@WEEK_START_DATE)+1

--SELECT Start_Week=@WEEK_START_DATE
--, End_Week=@WEEK_END_DATE
--INTO #WeekList

INSERT INTO #WeeklyList

SELECT Start_Week=@WEEK_START_DATE, End_Week=@WEEK_END_DATE

WHILE @Interval <= 0
    BEGIN
    set @WEEK_START_DATE=DATEADD(WEEK,1,@WEEK_START_DATE)
    set @WEEK_END_DATE=DATEADD(WEEK,1,@WEEK_END_DATE)
    INSERT INTO #WeeklyList values (@WEEK_START_DATE,@WEEK_END_DATE)
    SET @Interval += 1;
END

SELECT 
CONVERT(VARCHAR(11), Start_Week, 106) AS 'month_name',
CONVERT(VARCHAR(11), End_Week, 106) AS 'End',
DATEDIFF(DAY, 0, Start_Week) / 7 AS week_ref   -- create the unique week reference number
--'VIEW' AS month_name

FROM #WeeklyList

在本节中,我将创建 week_ref

DATEDIFF(DAY, 0, Start_Week) / 7 AS week_ref   -- create the unique week reference number

然后我需要将它与这个选择代码结合起来:

    DECLARE @YearString char(3) = CONVERT(char(3), SUBSTRING(CONVERT(char(5), @week_ref), 1, 3))
    DECLARE @MonthString char(2) = CONVERT(char(2), SUBSTRING(CONVERT(char(5), @week_ref), 4, 2))

    --Convert:
    DECLARE @Year int = CONVERT(int, @YearString) + 1200
    DECLARE @Month int = CONVERT(int, @MonthString)

**--THIS FILTERS THE REPORT**     
    SELECT     ts.staff_member_ref, sm.common_name, sm.department_name, DATENAME(MONTH, ts.start_dtm) + ' ' + DATENAME(YEAR, ts.start_dtm) AS month_name, 
                          ts.timesheet_cat_ref, cat.desc_long AS timesheet_cat_desc, grps.grouping_ref, grps.description AS grouping_desc, ts.task_ref, tsks.task_code, 
                          tsks.description AS task_desc, ts.site_ref, sits.description AS site_desc, ts.site_ref AS Expr1, 
                          CASE WHEN ts .status = 0 THEN 'Pending' WHEN ts .status = 1 THEN 'Booked' WHEN ts .status = 2 THEN 'Approved' ELSE 'Invalid Status' END AS site_status, 
                          ts.booked_time AS booked_time_sum,

    start_dtm, CONVERT(varchar(20), start_dtm, 108) + ' ' + CONVERT(varchar(20), start_dtm, 103) AS start_dtm_text, booked_time,
    end_dtm, CONVERT(varchar(20), end_dtm, 108) + ' ' + CONVERT(varchar(20), end_dtm, 103) AS end_dtm_text


    FROM       timesheets AS ts INNER JOIN
                          timesheet_categories AS cat ON ts.timesheet_cat_ref = cat.timesheet_cat_ref INNER JOIN
                          timesheet_tasks AS tsks ON ts.task_ref = tsks.task_ref INNER JOIN
                          timesheet_task_groupings AS grps ON tsks.grouping_ref = grps.grouping_ref INNER JOIN
                          timesheet_sites AS sits ON ts.site_ref = sits.site_ref INNER JOIN
                          vw_staff_members AS sm ON ts.staff_member_ref = sm.staff_member_ref



    WHERE     (ts.status IN (1, 2)) AND (cat.is_leave_category = 0)


    GROUP BY ts.staff_member_ref, sm.common_name, sm.department_name, DATENAME(MONTH, ts.start_dtm), DATENAME(YEAR, ts.start_dtm), ts.timesheet_cat_ref, 
                          cat.desc_long, grps.grouping_ref, grps.description, ts.status, ts.booked_time, ts.task_ref, tsks.task_code, tsks.description, ts.site_ref, sits.description, ts.start_dtm, 
                          ts.end_dtm
    ORDER BY sm.common_name, timesheet_cat_desc, tsks.task_code, site_desc

    DROP TABLE #WeeklyList

    GO

我想将 week_ref 传递到 SELECT 语句中(请参阅评论 - 这过滤报告),但问题是 week_ref 不是一个有效的列,因为它是由代码派生的。

有什么想法吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql inner-join


    【解决方案1】:

    只需在您需要过滤的日期对您的每周列表临时表执行 INNER JOIN。

    【讨论】:

      【解决方案2】:

      我不确定我是否真的理解这个问题,但我在您发布的代码中发现了 2 个问题。 您在#WeeklyList 临时表上进行的插入在所选值中缺少一列,我假设您想成为变量@week_ref

      我改变了这个,我得到了我没有的决赛桌选择点。

      希望这是解决您问题的开始

      【讨论】:

      • 谢谢,在此声明之后:WHERE (ts.status IN (1, 2)) AND (cat.is_leave_category = 0) 我想写 AND week_ref=@week_ref
      • 问题是无法识别变量 week_ref
      • 对不起,但我无法复制错误,我添加了“AND week_ref=@week_ref”部分,创建 sp 时没有错误,我只有一个错误“无效的对象名称'时间表' “因为我没有那张桌子。你能发布实际的错误信息吗?
      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多