Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
SQL IF或CASE in语句_Sql_Sql Server - Fatal编程技术网

SQL IF或CASE in语句

SQL IF或CASE in语句,sql,sql-server,Sql,Sql Server,用户正在从.aspx页面向我的跟踪表中输入数据。他们正在为不同的活动输入一系列日期,如果希望提醒他们该日期,则选中一个框。我目前面临的具体问题是限制我在声明中的专栏: SELECT [id], [name], MIN([DATE]) AS [MinDate] FROM track UNPIVOT ([DATE] FOR d IN ([date1],[date2],[date2])) unpvt GROUP BY [id], [name] 如果列date1chk的值为1,我只想包含date1。

用户正在从.aspx页面向我的跟踪表中输入数据。他们正在为不同的活动输入一系列日期,如果希望提醒他们该日期,则选中一个框。我目前面临的具体问题是限制我在声明中的专栏:

SELECT [id], [name], MIN([DATE]) AS [MinDate] 
FROM track UNPIVOT ([DATE] FOR d IN ([date1],[date2],[date2])) unpvt
GROUP BY [id], [name]
如果列date1chk的值为1,我只想包含date1。同样,对于date2,如果date2chk为1,等等。否则,该日期列不包括在in中

在此之后,我的挑战是能够更新该表,例如,如果date2是最小值,则将特定记录的date2chk从1设置为0

非常感谢您的想法——这是我处理过的最困难的问题之一

编辑感谢您的反馈:

数据 期望结果 假设我可以得到这个结果,我不确定如何更新表。例如,在期望的结果中,ID 1返回[Date1]和[Date2]都存在的最小值;我希望用户在第一个实例上停止提醒,因此[Date1Chk]将设置为0,而不是[Date2Chk]。

将取消提醒移动到子查询中,这样您就可以获取列的名称。然后where子句解决了您的问题:

select id, name, min([date]) as mindate
from (SELECT [id], [name], d, [DATE]
      FROM track
      UNPIVOT ([DATE] FOR d IN ([date1], [date2], [date2])) unpvt
    ) t
where (d = 'date1' and datecheck1 = 1) or
      (d = 'date2' and datecheck2 = 1) or
      (d = 'date3' and datecheck3 = 1)
GROUP BY [id], [name]
要获取特定日期,请使用行号而不是分组依据:

你可以用交叉申请。。值来取消PIVOT数据,而不是取消PIVOT函数,这允许您取消PIVOT到多个列:

SELECT  ID, MinDate = MIN(Date)
FROM    track
        CROSS APPLY
        (   VALUES
                (Date1, date1chk),
                (Date2, date2chk),
                (Date3, date3chk)
        ) t (Date, datechk)
WHERE   Datechk = 1
GROUP BY ID;
为了获得包含最小日期的列的名称,您可以稍微更改交叉应用以选择顶部1,而不是使用最小日期:


请显示样本数据和所需结果。文字问题很枯燥,我们无法验证我们的潜在解决方案是否能为您带来您想要的结果。谢谢戈登,这很有效。作为这个查询的一部分,有没有办法告诉d中的哪个日期列是最小日期?不管我的问题是什么,我发现我可以在顶层拉入“d”列。顺便说一句,要运行这个查询,我必须在子查询SELECT语句中添加'datecheck1'、'datecheck2'和'datecheck3'。多亏了Gareth,我也能够运行这个查询。在我的“期望结果”中,有没有办法确定mindate来自Date1还是Date2?
select id, name, min([date]) as mindate
from (SELECT [id], [name], d, [DATE]
      FROM track
      UNPIVOT ([DATE] FOR d IN ([date1], [date2], [date2])) unpvt
    ) t
where (d = 'date1' and datecheck1 = 1) or
      (d = 'date2' and datecheck2 = 1) or
      (d = 'date3' and datecheck3 = 1)
GROUP BY [id], [name]
select id, name, [date] as mindate
from (select id, name, [date],
             row_number() over (partition by id, name order by [date]) as seqnum
      from (SELECT [id], [name], d, [DATE]
            FROM track
            UNPIVOT ([DATE] FOR d IN ([date1], [date2], [date2])) unpvt
          ) t
      where (d = 'date1' and datecheck1 = 1) or
            (d = 'date2' and datecheck2 = 1) or
            (d = 'date3' and datecheck3 = 1)
     ) t
where seqnum = 1
SELECT  ID, MinDate = MIN(Date)
FROM    track
        CROSS APPLY
        (   VALUES
                (Date1, date1chk),
                (Date2, date2chk),
                (Date3, date3chk)
        ) t (Date, datechk)
WHERE   Datechk = 1
GROUP BY ID;
SELECT  ID, Name, MinDate = Date
FROM    track
        CROSS APPLY
        (   SELECT  TOP 1 Date, datechk, Name
            FROM    (VALUES
                        (Date1, date1chk, 'Date1'),
                        (Date2, date2chk, 'Date2'),
                        (Date3, date3chk, 'Date3')
                    ) t (Date, datechk, Name)
            WHERE   Datechk = 1
            ORDER BY Date
        ) t;