我有两个桌子
表1
ID SID Date value
1 1 2017-12-31 22.36
1 1 2018-03-31 20.0
1 1 2018-06-30 10.87
1 1 2018-09-30 67.98
1 2 2017-12-31 55.987
1 2 2018-03-31 60.12
1 2 2018-06-30 62.0
1 2 2018-09-30 15.543
1 3 2017-12-31 85.987
1 3 2018-03-31 40.12
1 3 2018-06-30 12.0
1 3 2018-09-30 15.543
表2
ID SID Date value
2 1 2017-12-31 22.36
2 1 2018-03-31 10.0
2 1 2018-06-30 10.87
2 1 2018-09-30 67.98
2 2 2017-12-31 55.987
2 2 2018-03-31 60.12
2 2 2018-06-30 31.0
2 2 2018-09-30 15.543
2 3 2017-12-31 85.987
2 3 2018-03-31 40.12
2 3 2018-06-30 06.0
Table1是基表。
表1和表2包含季度数据,这两个表中共有SID。
我正在努力实现:
以下是预期结果
ID SID Date value percent increase/decrease
1 1 2017-12-31 22.36 0
1 1 2018-03-31 20.018 50
1 1 2018-06-30 10.87 0
1 1 2018-09-30 67.98 0
1 2 2017-12-31 55.987 0
1 2 2018-03-31 60.12 0
1 2 2018-06-30 31.0 50
1 2 2018-09-30 15.543 0
1 3 2017-12-31 85.987 0
1 3 2018-03-31 40.12 0
1 3 2018-06-30 12.0 50
1 3 2018-09-30 15.543 data not available to compare in table 2
这是可以实现的吗? 我正在尝试编写一个查询以通过JOIN实现此目的,但是离它不远。下面是示例查询。
SELECT t1.ID,t1.SID,t1.Date,t1.value,
CASE WHEN (t1.Value -t2.Value/t1.value)*100=50 THEN '50' END AS 'percent increase/decrease'
FROM table t1 INNER JOIN table t2
ON t1.SID=t2.SID
对此有任何提示/想法吗?
谢谢!
答案 0 :(得分:1)
select t1.*,
case when t2.[Value] is null then null else (t1.[value] - t2.[value])/t1.[value] end
from table1 t1
left join table2 t2 on t1.SID = t2.SID and t1.[Date] = t2.[Date]
当null
中没有相应的值时,它将给出Table2
。我认为比在一列中混合数字和文本(两种数据类型)更好。
答案 1 :(得分:1)
您似乎还需要参加约会。并使用LEFT JOIN
代替INNER
SELECT
t1.ID,
t1.SID,
t1.Date,
t1.value,
CASE
WHEN (t1.Value -t2.Value/t1.value)*100=50 THEN '50'
WHEN t2.Value is null then 'data not available to compare in table 2'
ELSE '0'
END AS 'percent increase/decrease'
FROM table t1 LEFT JOIN table t2
ON t1.SID=t2.SID
and t1.Date = t2.Date
答案 2 :(得分:0)
select
case when t1.id is null or t2.id is null then cast(coalesce(t1.id,t2.id) as varchar(20)) + ' missing' else 'ok' end status,
t1.id,
t1.sid,
t1.date,
t1.value,
100.000 * (t1.value - t2.value)/t2.value as percchange
from Table1 t1 full join
table2 t2
on T1.id = t2.id and t1.sid=t2.sid and t1.DATE = t2.date
答案 3 :(得分:0)
我正在扩展scsimon的查询。我在功能上添加了括号,并强制转换为varchar,以使null具有相同的数据类型。
DECLARE @TABLE1 TABLE (ID int, SID int, ADate date, value real)
INSERT INTO @TABLE1
SELECT 1, 1, '2017-12-31', 22.36 UNION ALL
SELECT 1, 1, '2018-03-31', 20.0 UNION ALL
SELECT 1, 1, '2018-06-30', 10.87 UNION ALL
SELECT 1, 1, '2018-09-30', 67.98 UNION ALL
SELECT 1, 2, '2017-12-31', 55.987 UNION ALL
SELECT 1, 2, '2018-03-31', 60.12 UNION ALL
SELECT 1, 2, '2018-06-30', 62.0 UNION ALL
SELECT 1, 2, '2018-09-30', 15.543 UNION ALL
SELECT 1, 3, '2017-12-31', 85.987 UNION ALL
SELECT 1, 3, '2018-03-31', 40.12 UNION ALL
SELECT 1, 3, '2018-06-30', 12.0 UNION ALL
SELECT 1, 3, '2018-09-30', 15.543
DECLARE @TABLE2 TABLE (ID int, SID int, ADate date, value real)
INSERT INTO @TABLE2
SELECT 2, 1, '2017-12-31', 22.36 UNION ALL
SELECT 2, 1, '2018-03-31', 10.0 UNION ALL
SELECT 2, 1, '2018-06-30', 10.87 UNION ALL
SELECT 2, 1, '2018-09-30', 67.98 UNION ALL
SELECT 2, 2, '2017-12-31', 55.987 UNION ALL
SELECT 2, 2, '2018-03-31', 60.12 UNION ALL
SELECT 2, 2, '2018-06-30', 31.0 UNION ALL
SELECT 2, 2, '2018-09-30', 15.543 UNION ALL
SELECT 2, 3, '2017-12-31', 85.987 UNION ALL
SELECT 2, 3, '2018-03-31', 40.12 UNION ALL
SELECT 2, 3, '2018-06-30', 06.0
SELECT
t1.ID,
t1.SID,
t1.ADate,
t1.value,
[percent increase/decrease]=CASE
WHEN t2.Value is null THEN 'data not available to compare in table 2'
ELSE CAST(((t1.Value - t2.Value)/t1.value)*100 AS varchar(20))
END
FROM @TABLE1 t1
LEFT JOIN @TABLE2 t2 ON
t1.SID=t2.SID
AND
t1.ADate = t2.ADate