【问题标题】:Selecting specific Data per month每月选择特定数据
【发布时间】:2014-01-13 17:44:34
【问题描述】:

所以我有一个表格,可以根据月份确定分公司地区代码
让我们从January to february it's Region code would be 1, from February to March it would be 2for the month of april upto date would be 3 说起

所以这是表格的示例外观

我有一个从表中获取数据的代码,但我想要实现的是,如果所选数据的 LoanDate 在上面的日期内(在 fld_Datefrom 和 fld_Dateto 之间),它将使用 fld_BranchRegion 表示为以上。 (例如,日期的贷款日期是 2013-01-12 00:00:00 它将使用 RegionCode 4A 如上所述,如果数据是 2013-02-04 00:00:00 它将使用区域代码 3

这是我使用的代码

SELECT 
       TE.LOAN
       ,bp.REGION
       ,BP.ID
       ,TE.AMOUNT 
       ,te.ID       
FROM #TrackExpired TE
    inner join Transactions.TBLMAIN PM
    on TE.ID = PM.ID
    inner join #track BP
    on BP.ID=cast(TE.ID/1000000000000 as decimal(38,0))
WHERE ((cast(TE.EXPIRATION as date) < cast(TE.newloandate as date)) 
      OR(TE.NewLoanDate is null and (cast(TE.EXPIRATION as date) < cast(PM.REDEEMED as date))) or ((TE.NewLoanDate is null and PM.REDEEMED is null) and (PM.STATUS = 7 or PM.STATUS = 5))  ) 

这样做的问题是它会生成重复值,所以我在 #track 表中出现了 3 次日期,数据的数量也使用不同的区域代码输出了 3 次!!

我不想输出它们,而是从 **#track 中选择区域代码 基于数据的借出日期。**

我只是想实现这一点,而不是输出所有区域代码,它只会使用基于提供的 #track 表的范围之间的区域代码..

有什么帮助吗?还是其他方法??谢谢!。抱歉,我是 SQL 新手。

EDIT 这里是创建临时表的代码。

#trackexpired

 SELECT PH.ID
      ,PH.LOAN
      ,PH.EXPIRATION
      ,PH.AMOUNT
      ,(SELECT T3.LOAN FROM Transactions.HISTO T3 INNER JOIN 
              (
                        SELECT MIN(T2.ID) as pawnhisto 
                        FROM Transactions.HISTO T2 
                        WHERE T2.ID > PH.ID
                            AND PH.ID = T2.ID
              ) T4
                        ON T4.pawnhisto = T3.ID

      )as 'NewLoanDate' 
INTO #TrackExpired
FROM Transactions.HISTO PH
    INNER JOIN Transactions.MAIN PM
    ON PM.ID=PH.ID
WHERE YEAR(PH.LOAN) = @YEAR

#track

   Select  bt.CODE
        ,bp.ID
        ,AREA
        ,REGION
        ,NCODE
        ,FROM
        ,isnull(fld_Dateto,GETDATE()) as fld_Dateto
 into #sort
 from Transactions.tbl_BranchTracking bt
 inner join Reference.tbl_BranchProfiles bp
 on bt.CODE = bp.CODE

 Select * into #track from #sort
 where @YEAR >= year(FROM)
        and
      @YEAR <= year(fld_Dateto)

【问题讨论】:

  • 这些似乎不是重复的。查看 PawnMainID 字段值;它们都是独一无二的。
  • @BillStidham 这些只是示例如果您向上滚动它们,4A 的集合与 3 作为区域代码的集合数据相同。这些只是示例屏幕截图
  • @BillStidham 请再次检查我编辑截图的问题,谢谢。
  • 看起来 PawnMainID 在其左侧部分包含分支 ID。 #TrackExpired 和 tbl_PawnMain 之间的 JOIN 是基于一对一的 ID 匹配。但是,您在 tbl_PawnMain 和 #track 之间的 JOIN 是基于来自 #track 的分支 ID 以及从 #TrackExpired 上的 ID 中提取的分支 ID。在不知道这两个临时表是如何构建的情况下,我冒险猜测这个分支 id JOIN 约束是导致重复的原因,因为它可能不是一对一的。
  • @BillStidham 我已经按照您的要求提供了创建两个临时表的代码。谢谢。

标签: sql sql-server tsql date sql-server-2008-r2


【解决方案1】:

测试数据

create table #LoanTable (
  ID  int not null,
  RegionCode nvarchar(50) not null,
  LoanDate datetime not null
  );

insert into #LoanTable values
(1,'5','10/01/2014'),
(2,'5','10/18/2014'),
(3,'5','10/02/2014'),
(4,'3','04/11/2014'),
(5,'3','04/05/2014'),
(6,'4A','01/09/2014'),
(7,'4A','01/05/2014')

create table #LoanDetailsTable (
  ID  int not null,
  LoanAmount INT not null,
  LoanDate datetime not null
  );

  insert into #LoanDetailsTable values
(1,5000,'10/15/2014'),
(2,1000,'10/11/2014'),
(3,2000,'10/09/2014'),
(4,1500,'04/13/2014'),
(5,5000,'04/17/2014'),
(6,500,'01/19/2014'),
(7,2500,'01/15/2014')

查询

;With RegCode
AS
 (
    SELECT RegionCode, MAX(MONTH(LoanDate)) [Month]
    FROM #LoanTable
    GROUP BY RegionCode
 )
SELECT LDT.* , RC.RegionCode
FROM #LoanDetailsTable LDT INNER JOIN RegCode RC
ON MONTH(LDT.LoanDate) = RC.[Month]

结果

ID  LoanAmount  LoanDate                  RegionCode
1   5000        2014-10-15 00:00:00.000       5
2   1000        2014-10-11 00:00:00.000       5
3   2000        2014-10-09 00:00:00.000       5
4   1500        2014-04-13 00:00:00.000       3
5   5000        2014-04-17 00:00:00.000       3
6   500         2014-01-19 00:00:00.000       4A
7   2500        2014-01-15 00:00:00.000       4A

使用 CTE 提取日期的月份部分以及与之关联的区域代码,然后将其与贷款日期月份的数据表连接,并在 cte 中提取月份并获取当时的区域代码。快乐的日子:)

【讨论】:

  • 这行得通,问题是区域代码每个月都不同,所以它应该像我上面显示的那样放在一个表格上,而不是硬编码
  • @User6675636b20796f7521 是的,没关系,您可以在案例语句中添加 12 个 WHEN 语句并提供一年中所有 12 个月的区域代码。
  • 是的,它可以改变,它不应该是硬编码它应该基于表#track,上面提供了一个示例图像。谢谢你!
  • 意思是说如果月份是1就等于4A,.
  • 它的 CTE(命令表表达式)在 BOL 上阅读了有关它的信息,请阅读我的答案中的详细信息,希望它能充分解释我在这段代码中所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2015-04-03
  • 1970-01-01
  • 2019-10-04
  • 2017-03-09
  • 2019-07-26
  • 2020-11-24
相关资源
最近更新 更多