【问题标题】:How to Compare two columns data of two table and save its difference in percentage in SQL如何比较两个表的两列数据并在SQL中保存其百分比差异
【发布时间】:2018-07-23 22:46:42
【问题描述】:

我有两张桌子

表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   

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

谢谢!

【问题讨论】:

  • 顺便说一句 - 如果这是一个单一的数据库 - 您可能需要重新考虑数据库设计,两个表具有相同的结构,因此它们可能是一个带有标识符字段的表

标签: sql sql-server tsql


【解决方案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

【讨论】:

  • 没问题@TechnoSavvy
【解决方案2】:
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]

Table2 中没有对应的值时,它会给出null。我认为比在一列中混合数字和文本(两种数据类型)要好。

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:

      我正在扩展 scsimon 的查询。我在函数上添加了括号并强制转换为 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2014-02-26
        • 2013-04-25
        相关资源
        最近更新 更多