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

时间:2018-07-23 13:06:30

标签: 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    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。

我正在努力实现:

  • 在以下值的列中查找减少/增加的百分比 如果表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   

对此有任何提示/想法吗?

谢谢!

4 个答案:

答案 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