Mysql 根据变量从多行中选择一行
伙计们,你们知道怎么解决这个问题吗 我撞到了砖墙。我在报告后面写代码。报告必须根据Mysql 根据变量从多行中选择一行,mysql,sql,tsql,Mysql,Sql,Tsql,伙计们,你们知道怎么解决这个问题吗 我撞到了砖墙。我在报告后面写代码。报告必须根据财务年度变量显示颜色 以下是一个表格示例: CompanyID | StartDate | EndDate | ReviewDate | FinancialYear | Colour 46 | 2012-01-18 | 2013-12-17 | 2013-12-15 | 2012 | Red 46 | 2013-12-17 | 1900-
财务年度
变量显示颜色
以下是一个表格示例:
CompanyID | StartDate | EndDate | ReviewDate | FinancialYear | Colour
46 | 2012-01-18 | 2013-12-17 | 2013-12-15 | 2012 | Red
46 | 2013-12-17 | 1900-01-01 | 2017-03-10 | 2014 | Red
46 | 2011-05-11 | 2012-01-17 | 2011-06-30 | 2014 | Orange
当变量财务年度
为2016
时,CompanyID
应显示红色
,因为结束日期
为'
结果应显示第n行编号2
但是,如果FinancialYear
变量为2012
,我有两行符合标准,需要选择一行大于EndDate
或StartDate
,Reviewdate
。
结果应该显示第1行
有人知道怎么做吗?谢谢你的反馈
到目前为止,我所尝试的:
SELECT
CompanyID
, StartDate AS [Traffic Lights Start Date]
, EndDate AS [Traffic Lights End Date]
, ReviewDate AS [Traffic Lights Review Date]
, Category AS [Traffic Lights Colour]
, CASE
WHEN (YEAR(EndDate) <> 1900
AND @FinancialYear BETWEEN (YEAR(DATEADD(DD,0, DATEDIFF(DD,0, DATEADD(MM, -(((12 + DATEPART(M, CAST(StartDate AS DATETIME))) - 7)%12), CAST(StartDate AS DATETIME))))) +1)
AND (YEAR(DATEADD(DD,0, DATEDIFF(DD,0, DATEADD(MM, -(((12 + DATEPART(M, CAST(EndDate AS DATETIME))) - 7)%12), CAST(EndDate AS DATETIME))))) +1)
AND (YEAR(DATEADD(DD,0, DATEDIFF(DD,0, DATEADD(MM, -(((12 + DATEPART(M, CAST(ReviewDate AS DATETIME))) - 7)%12), CAST(ReviewDate AS DATETIME)))))+1) >= @FinancialYear)
THEN '1'
WHEN
(YEAR(EndDate) = 1900
AND YEAR(ReviewDate) > = @FinancialYear)
THEN '1'
ELSE '0'
END AS FinancialYear_TrafficLights
, (YEAR(DATEADD(MONTH,-((DATEPART(MONTH,CAST(StartDate AS DATETIME)) +7) %12),CAST(StartDate AS DATETIME)))+1) AS Actual_Financial_Year
, ROW_NUMBER() OVER(PARTITION BY Company ORDER BY StartDate ASC) AS LatestRow
FROM
CompanyTrafficLightHistory
选择
公司ID
,起始日期为[交通灯开始日期]
,结束日期为[交通灯结束日期]
,修订日期为[交通灯审查日期]
,类别为[交通灯颜色]
案例
1900年(截止日期)时
和@FinancialYear之间(年份(日期添加(DD,0,DATEDIFF)(DD,0,DATEADD(MM),((12+DATEPART(M,CAST(StartDate作为DATETIME)))-7)%12),CAST(StartDate作为DATETIME')))+1)
和(年份(DATEADD(DD,0,DATEDIFF)(DD,0,DATEADD(MM),((12+DATEPART(M,CAST(EndDate AS DATETIME)))-7)%12),CAST(EndDate AS DATETIME()())+1)
和(年份(DATEADD(DD,0,DATEDIFF)(DD,0,DATEADD(MM,-((12+DATEPART(M,CAST(ReviewDate AS DATETIME)))-7)%12),CAST(ReviewDate AS DATETIME()()))+1)>=@FinancialYear)
然后是“1”
什么时候
(年份(截止日期)=1900
年份(回顾日期)>=财务年度)
然后是“1”
其他“0”
以财务年度\交通灯结束
,(年(日期加上(月),((日期部分(月,演员表(起始日期为日期时间))+7)%12),演员表(起始日期为日期时间))+1)作为实际财务年度
,行号()超过(按StartDate ASC按公司订单划分)作为LatestRow
从…起
公司交通史
如果您只在一行之后,那么您需要对数据集进行排序,然后选择top 1。通过添加或删除字段并使用desc
指定降序(默认为升序),可以更改数据集在order by
子句中的排序方式:
请使用“显示创建表”添加表定义。显示您尝试的内容?即使它不起作用,它也表明了你的努力&你的思路(谢谢!)我不知道如何在这里添加SQL格式的代码,但我已经用它编辑了我的问题。我想我必须以某种方式对输出进行排序,然后从中选择前1位…但我不确定我的想法是否正确,也不确定如何用您想要的输出实现它?请添加一个包含您希望脚本结果的表。谢谢您的时间,Dave!:)工作出色,但是,当您选择2016财年时,输出应显示红色,因为结束日期字符串为空,1900-01-01因此没有结束日期。这有意义吗?FinancialYear在哪里成功了:)谢谢Dave!:)
declare @t table (CompanyID int
,StartDate date
,EndDate date
,ReviewDate date
,FinancialYear int
,Colour nvarchar(50)
);
insert into @t values
(46,'20120118','20131217','20131215',2012,'Red')
,(46,'20131217','19000101','20170310',2014,'Red')
,(46,'20110511','20120117','20110630',2014,'Orange');
declare @FinancialYear int = 2012;
select top 1 *
from @t
where FinancialYear = @FinancialYear
order by case when EndDate = '19000101' -- Because you want 1900-01-01 to be seen as 'most recent',
then '29990101' -- you need to replace it with a value way into the future.
else EndDate
end desc;