如何比较两个表的两列数据并将其百分比差异保存在SQL中
我有两张桌子 表1如何比较两个表的两列数据并将其百分比差异保存在SQL中,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两张桌子 表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
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
表1是基础表
表1和表2包含季度数据,SID在这两个表中很常见
我正在努力实现:
- 要了解列中值的减少/增加百分比 表1和表2各自的SID。如果表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
这方面有什么提示/想法吗
谢谢
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]
当表2中没有相应的值时,它将给出null
。我认为这比在一列中混合数字和文本(两种数据类型)要好
当表2中没有相应的值时,它将给出null
。我认为这比在一列中混合数字和文本(两种数据类型)要好。看起来你也需要在日期加入。并使用左连接
而不是内部连接
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
看起来你也需要在约会时加入。并使用左连接
而不是内部连接
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
我正在扩展西蒙的问题。我在函数上添加了括号,并将其转换为varchar,以便为空值提供相同的数据类型
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
我正在扩展西蒙的问题。我在函数上添加了括号,并将其转换为varchar,以便为空值提供相同的数据类型
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
顺便说一句-如果这是一个数据库-您可能需要重新考虑数据库设计,两个表具有相同的结构,因此它们可以是一个带有标识符字段的表。顺便说一句-如果这是一个数据库-您可能需要重新考虑数据库设计,两个表具有相同的结构,因此,它们可以是一个带有标识符字段的表no problem@technosavyno problem@technosavy