Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据变量从多行中选择一行_Mysql_Sql_Tsql - Fatal编程技术网

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;