Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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中_Sql_Sql Server_Tsql - Fatal编程技术网

如何比较两个表的两列数据并将其百分比差异保存在SQL中

如何比较两个表的两列数据并将其百分比差异保存在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

我有两张桌子

表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