我有一個場景,我需要根據月末選擇資料。
原始資料如下所示:
| ID | 日期 | 成本 | IS_REVERSED | 反向 ID |
|---|---|---|---|---|
| 1 | 2021-01-01 | 1 美元 | 不 | 空值 |
| 2 | 2021-01-30 | 2 美元 | 是的 | 空值 |
| 3 | 2021-02-01 | 3 美元 | 空值 | 2 |
| 4 | 2021-02-03 | 4 美元 | 不 | 空值 |
請注意IS_REVERSED標志欄和Reverse_ID列。如果事務在第一次嘗試中成功,則標志為 NO,但如果事務在第二次嘗試中成功,則標志為 NULL
如果我在1月底運行報告,我想要的輸出應該包含在 1月份發生的所有交易(即使它逆轉是 Yes 但逆轉尚未發生)
編號 1、2
對于下個月底,我需要報告1 月和 2 月合并的資料。并且所需的輸出應該是
ID 1、3 和 4
ID為2應該不會,因為有是的反轉標記報
任何實作這一目標的指標將不勝感激。
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)
我需要一個查詢,我可以在其中傳遞 [date] 作為過濾記錄的條件。(date < '2021-01-31' 應該帶來 id 1,2 ) (date <'2021-02-28' 應該帶來 id 1,3,4) ID 2 不應該出現,因為交易被逆轉了,我們有一個IS_REVERSE 標志為 NULL 的新事務 (Id 3)。
謝謝
uj5u.com熱心網友回復:
我使用動態 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)

uj5u.com熱心網友回復:
我假設您需要估算您希望運行的報告的日期。在這種情況下,我將為您的 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)
任何一種方法都可以解決問題!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337064.html
標籤:sql sql-server 查询语句 数据集
