【问题标题】:Data Selection SQL数据选择 SQL
【发布时间】:2021-12-09 14:33:32
【问题描述】:

我有一个场景,我需要根据月末选择数据。

原始数据如下所示:

ID Date Cost IS_REVERSED Reverse_ID
1 2021-01-01 $1 No NULL
2 2021-01-30 $2 YES NULL
3 2021-02-01 $3 NULL 2
4 2021-02-03 $4 No NULL

请注意IS_REVERSED 标志列和Reverse_ID 列。如果事务在第一次尝试中成功,则标志为 NO,但如果事务在第二次尝试中成功,则标志为 NULL

如果我在 1 月 结束运行报告,我想要的输出应该会带来 1 月发生的所有交易(即使它反转为是但尚未发生反转)

ID 1、2

对于下个月末,我需要报告 1 月和 2 月合并的数据。并且期望的输出应该是

ID 1、3 和 4

Id 2 应该报告,因为它的反向标志是 Yes

任何实现这一目标的指针将不胜感激。

Create table Test_Report
    (ID Int
    ,[Date] date
    ,Cost varchar(100)
    ,Is_reversed varchar(100)
    ,Reversed_ID int)
    
insert into  Test_Report values 
    (1     ,'2021-01-01',       '$1'     ,            'No',            NULL),
    (2     ,'2021-01-30',       '$2'     ,            'YES',            NULL),
    (3     ,'2021-02-01',       '$3'     ,            NULL,            2),
    (4     ,'2021-02-03',       '$4'     ,            'No',            NULL)

我需要一个查询,我可以在其中传递 [日期] 作为过滤记录的条件。 (日期

谢谢

【问题讨论】:

  • @Namish 你的日期列是 varchar 列吗?
  • 01 Jan 这不是约会。这是去年的吗?今年? 1990 年?

标签: sql sql-server tsql dataset


【解决方案1】:

我使用动态 SQL 查询来实现结果。由于您的数据不清楚并且我看到数据类型不正确,因此使用了假设。因此,答案中包含了 DML 和 DDL

Create table Test_Report
(ID Int
,[Date] varchar(100)
,Cost varchar(100)
,Is_reversed varchar(100)
,Reversed_ID int)

  insert into  Test_Report values (1     ,'01 Jan',       '$1'     ,            'No',            NULL)
   ,(1     ,'30 Jan',       '$2'     ,            'YES',            NULL)
   ,(1     ,'01 Feb',       '$3'     ,            NULL,            2)
   ,(1     ,'03 Feb',       '$4'     ,            'No',            NULL)


 declare @from  varchar(100) = 'Jan'
  , @to varchar(100) = 'Feb'

 declare @where varchar(max)  
 declare @query varchar(max)

 set @query = 'select * from Test_Report where '

 if @from = @to 
    begin 
       set @where = ' [Date] like ''%'+@from+ '%''   and  ( isnull(Is_reversed,'''') in (''No'', ''YES'', '''')) and  Reversed_ID is null' 
    end 
else
    begin
         set @where = ' ( [Date] like ''%'+@from+ '%'' or [Date] like ''%'+@to+ '%'' ) and    ( isnull(Is_reversed,'''') in (''No'', ''''))' 
    end 

  Declare @Main varchar(max) = @query + @where

  --This statement can be used to test the resulted query
  --select @Main

  exec(@main)

【讨论】:

  • @Namish 如果您需要任何进一步的帮助,请告诉我,很乐意提供帮助。如果您有任何更改,请告诉我。我可以帮忙:)
  • 谢谢@Gudwlk。感谢您的查询,但我认为这不正是我所追求的。让我简化查询:` Create table Test_Report (ID Int ,[Date] date ,Cost varchar(100) ,Is_reversed varchar(100) ,Reversed_ID int) insert into Test_Report values (1 ,'2021-01-01', ' $1' , '否', NULL) ,(2 ,'2021-01-30', '$2' , 'YES', NULL) ,(3 ,'2021-02-01', '$3' , NULL, 2 ) ,(4 ,'2021-02-03', '$4' , '否', NULL) `
  • 我需要一个查询,我可以将结束日期限制为“2021-01-31”应该带入 ID 1,2,日期“2021-02-28”应该带入 1,3, 4 Select * from Test_Report where isnull(Is_reversed,'') in ('No', 'YES', '') and [Date]
  • 我现在看到的数据有所不同。我会检查并通知您
【解决方案2】:

我假设您需要估算您希望生成的报告的日期。在这种情况下,我将为您的 WHERE 子句声明一个变量。

此变量输出当前日期,但您可以将 GETDATE() 语法替换为日期值以使查询动态化。现在 WHERE 子句...

DECLARE @DATEVAR AS DATE = GETDATE()

SELECT *
    ,EOMONTH(#Test_Report.[Date],0) [EOMONTH for WHERE clause]
FROM #Test_Report
WHERE (Is_reversed != 'YES'
        OR Is_reversed IS NULL)
    AND #Test_Report.[Date] <= EOMONTH(@DATEVAR,0)

这里可以使用 EOMONTH() 函数来评估所选月份的月底,并选择小于该月底日期的所有记录。由于您想要 Is_reversed 不是 YES 且为 NULL 的两条记录,我们需要在括号中放置一个 OR 子句。

期望的输出:

处理空值的更聪明的方法是 ISNULL(,) 函数。您可以在 WHERE 子句中使用它来使该约束成为 1-liner。

SELECT *
    ,EOMONTH(#Test_Report.[Date],0) [EOMONTH for WHERE clause]
FROM #Test_Report
WHERE ISNULL(Is_reversed,'No') != 'YES'
    AND #Test_Report.[Date] <= EOMONTH(@DATEVAR,0)

任何一种方法都可以解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多