sql—将数据展平并连接到视图以显示历史值

8wigbo56  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(222)

我有两个数据集需要组合在一起。。。好吧,不止2个,但是1是一个已经设置好的视图,然后是一个表,我的任务是添加到视图中,使它更“历史”。
当前视图有很多列,但是( dbo.vw_Site_Levels )影响我需要的是:

| Facility_Id | Site_Id | Grd_Val | Top_Val |
| ----------- | ------- | ------- | ------- |
| 7552        | 1-BCH   | 701.23  | 855.21  |
| 7552        | 2-BCH   | 701.23  | 855.21  |
| 7552        | 3-BCH   | 614.86  | 716.74  |
| ...         | ...     | ...     | ...     |

但很显然,根据日期的不同 Grd_Val 以及 Top_Val 可能是不正确的,所以我应该带一张table过来, dbo.Measure_Data ,使用此结构:

| Facility_Id | Site_Id | Date                    | Desc | Val     |
| ----------- | ------- | ----------------------- | ---- | ------- |
| 7552        | 1-BCH   | 2015-09-03 00:00:00.000 | GRD  | 683.00  |
| 7552        | 1-BCH   | 2015-09-03 00:01:00.000 | TOP  | 826.49  |
| 7552        | 1-BCH   | 2016-04-04 00:00:00.000 | GRD  | 701.23  |
| 7552        | 1-BCH   | 2016-04-04 00:01:00.000 | TOP  | 843.87  |
| 7552        | 1-BCH   | 2017-01-05 00:01:00.000 | TOP  | 855.21  |
| ...         | ...     | ...                     | ...  | ...     |

平展和展示 Grd_Val 以及 Top_Val 有日期,看起来像这样:

| Facility_Id | Site_Id | Date       | Grd_Val | Top_Val |
| ----------- | ------- | ---------- | ------- | ------- |
| 7552        | 1-BCH   | 2015-09-03 | 683.00  | 826.49  |
| 7552        | 1-BCH   | 2016-04-04 | 701.23  | 843.87  |
| 7552        | 1-BCH   | 2017-01-05 | 701.23  | 855.21  |
| ...         | ...     | ...        | ...     | ...     |

我知道这两天的日期相差一分钟 Measure_Data ,我不控制数据,它只是因为它需要一个 Facility_Id , Site_Id ,和 Date .
有人能帮我吗?我试过一些似乎不值得一提的事情,因为它们没有接近我所需要的,虽然我确实接近一个,我想,我的电脑重置和失去我的查询(我正在做一个 GROUP BY 在一些事情上,我认为是一个自我连接,以扁平化的数据,但它是在星期五,我不记得了)。

wa7juj8i

wa7juj8i1#

您可以通过使用条件聚合来实现这一点:

SELECT
    md.Facility_Id,
    md.Site_Id,
    [Date]  = CAST(md.[Date] AS DATE),
    Grd_Val = MAX(CASE WHEN md.[Desc] = 'GRD' THEN md.Val END),
    Top_Val = MAX(CASE WHEN md.[Desc] = 'TOP' THEN md.Val END)
FROM dbo.Measure_Data md
GROUP BY
    md.Facility_Id, md.Site_Id, CAST(md.Date AS DATE)
ORDER BY
    md.Facility_Id, md.Site_Id, CAST(md.Date AS DATE);
ifmq2ha2

ifmq2ha22#

可以使用pivot操作符来执行此操作。

DECLARE @facility table( Facility_Id int, Site_Id varchar(10), Datev datetime, Descr char(3), Val decimal(5,2))
INSERT INTO @facility
values
(7552        ,'1-BCH','2015-09-03 00:00:00.000','GRD',683.00),
(7552        ,'1-BCH','2015-09-03 00:01:00.000','TOP',826.49),
(7552        ,'1-BCH','2016-04-04 00:00:00.000','GRD',701.23),
(7552        ,'1-BCH','2016-04-04 00:01:00.000','TOP',843.87);

select Facility_Id, Site_Id, dt as [date], grd as grd_val, [top] as top_val from 
(select Facility_Id, Site_Id, cast(datev as date) as dt, Descr, val from @facility) as t
pivot
(sum(val)
for descr in ([GRD],[TOP])
)as pvt

设施地址地址地址地址地址:valtop地址:75521-bch2015-09-03683.00826.4975521-bch2016-04-04701.23843.87

相关问题