【问题标题】:Manipulate Row corresponding to MIN(Date) to a Default value将对应于 MIN(Date) 的行操作为默认值
【发布时间】:2016-12-02 23:26:00
【问题描述】:

表T

+----+------------+----------+----------+----------+----+----+----+
| ID |   Sdate    |    Pr    |   Oxy    |   Met    | D1 | D2 | D3 |
+----+------------+----------+----------+----------+----+----+----+
|  1 | 7/14/2016  | Negative | Positive | Negative | N  | P  | N  |
|  1 | 8/10/2016  | Positive | Negative | Negative | P  | N  | N  |
|  1 | 9/23/2016  | Positive | Positive | Negative | P  | P  | N  |
|  2 | 6/17/2015  | Negative | Negative | Negative | N  | N  | N  |
|  2 | 8/1/2015   | Negative | Positive | Positive | N  | P  | P  |
|  2 | 11/19/2015 | Positive | Negative | Negative | P  | N  | N  |
|  3 | 2/28/2016  | Negative | Positive | Positive | N  | P  | P  |
|  3 | 4/3/2016   | Positive | Positive | Negative | P  | P  | N  |
+----+------------+----------+----------+----------+----+----+----+

我需要默认对应于每个组中的最小日期的行以显示 D1、D2、D3 AS P 的所有值并将组中的剩余值设置为其他值

期望的输出:

+----+------------+----------+----------+----------+----+----+----+
| ID |   Sdate    |    Pr    |   Oxy    |   Met    | D1 | D2 | D3 |
+----+------------+----------+----------+----------+----+----+----+
|  1 | 7/14/2016  | Negative | Positive | Negative | P  | P  | P  |
|  1 | 8/10/2016  | Positive | Negative | Negative | P  | N  | N  |
|  1 | 9/23/2016  | Positive | Positive | Negative | P  | P  | N  |
|  2 | 6/17/2015  | Negative | Negative | Negative | P  | P  | P  |
|  2 | 8/1/2015   | Negative | Positive | Positive | N  | P  | P  |
|  2 | 11/19/2015 | Positive | Negative | Negative | P  | N  | N  |
|  3 | 2/28/2016  | Negative | Positive | Positive | P  | P  | P  |
|  3 | 4/3/2016   | Positive | Positive | Negative | P  | P  | N  |
+----+------------+----------+----------+----------+----+----+----+

代码尝试:

SELECT
    ID
    ,SDate
    ,CASE WHEN T.Pr = 'Positive' THEN 'P' ELSE 'N' END AS D1
    ,CASE WHEN T.Oxy = 'Positive' THEN 'P' ELSE 'N' END AS D2
    ,CASE WHEN T.Met = 'Positive' THEN 'P' ELSE 'N' END AS D3
FROM T

不知道如何使用GROUP BY 作为ID,然后像嵌套CASE 一样

CASE WHEN MIN(DATE) THEN 'P' ELSE CASE WHEN T.Pr...(and so on)

任何替代方法也将不胜感激。谢谢。

【问题讨论】:

  • 什么是公关?什么是氧?什么是大都会?
  • 只是结果连接表中的不同字段,我不需要按原样显示。只有这个来自我创建的示例表的简化结果。
  • 您在代码尝试中使用了这些列,那么您是说那些没有必要?如果它们不是必需的,你能解释一下为什么每一行+每一列都有它的价值吗?
  • 不认为包含它们会特别有用,但已编辑。谢谢。

标签: sql-server sql-server-2012 group-by case


【解决方案1】:
CREATE TABLE #TMP(ID INT
                    ,Sdate dATE
                    ,D1 CHAR(1)
                    ,D2 CHAR(1)
                    ,D3 CHAR(1)
                    )
INSERT INTO #TMP
VALUES
    (1,'20160714','N','P','N')
    ,(1,'20160810','P','N','N')
    ,(1,'20160923','P','P','N')
    ,(2,'20150617','N','N','N')
    ,(2,'20150801','N','P','P')
    ,(2,'20151119','P','N','N')
    ,(3,'20160228','N','P','P')
    ,(3,'20160403','P','P','N')

SELECT 
    A.ID
    ,A.Sdate
    ,CASE WHEN A.Sdate = C.Sdate THEN 'P' ELSE A.D1 END AS D1
    ,CASE WHEN A.Sdate = C.Sdate THEN 'P' ELSE A.D2 END AS D2
    ,CASE WHEN A.Sdate = C.Sdate THEN 'P' ELSE A.D3 END AS D3
FROM
    #TMP A
        CROSS APPLY (SELECT TOP 1 ID,SDate FROM #TMP B WHERE A.ID=B.ID ORDER BY Sdate ASC) C

【讨论】:

  • 格式化全部排序
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多