【问题标题】:SQL Server How to multiply two queriesSQL Server 如何将两个查询相乘
【发布时间】:2017-07-12 15:36:27
【问题描述】:

所以我有两个不同的查询如下:

Query1
CPT        Resource     1      2        3      4      5
2017-06-12  RM1        5.00   5.00    4.00   4.00   2.00
2017-06-12  RM2        3.00   6.00    4.00   7.00   4.00
2017-06-12  RM3        3.00   4.00    6.00   8.00   6.00
2017-06-13  RM1        3.00   7.00    5.00   3.00   5.00
2017-06-13  RM2        4.00   5.00    4.00   2.00   4.00
2017-06-13  RM3        2.00   4.00    5.00   2.00   7.00
2017-06-14  RM1        2.00   4.00    6.00   4.00   2.00
2017-06-14  RM2        6.00   5.00    4.00   5.00   2.00
2017-06-14  RM3        5.00   3.00    7.00   4.00   5.00

    Query2
    CPT        Resource     1      2        3      4      5
    2017-06-12  RM1        0.00  -2.00    0.00   0.00  -2.00
    2017-06-12  RM2       -3.00  -3.00    0.00   0.00   0.00
    2017-06-12  RM3       -1.00  -3.00    0.00   0.00   0.00
    2017-06-13  RM1        0.00  -1.00    0.00   0.00   0.00
    2017-06-13  RM2        0.00  -1.00   -1.00  -2.00  -2.00
    2017-06-13  RM3       -2.00  -3.00   -1.00   0.00   0.00
    2017-06-14  RM1        0.00   0.00    0.00   0.00   0.00
    2017-06-14  RM2        0.00  -4.00   -3.00  -2.00   0.00
    2017-06-14  RM3        0.00  -3.00   -1.00   0.00  -2.00

通过这两个查询,我将如何创建一个新查询,该查询将 query1 中的数据与查询 2 中的相应数字相乘,该数字基于该日期、资源和小时(即标题 1 , 2, 3, 4 和 5)。我也只想要正数,所以新数据应该乘以 -1。

如果我手动执行此操作,新表应如下所示:

Query3
    CPT        Resource     1      2        3      4      5
    2017-06-12  RM1        0.00  10.00    0.00   0.00   4.00
    2017-06-12  RM2        9.00  18.00    0.00   0.00   0.00
    2017-06-12  RM3        3.00  12.00    0.00   0.00   0.00
    2017-06-13  RM1        0.00   7.00    0.00   0.00   0.00
    2017-06-13  RM2        0.00   5.00    4.00   4.00   8.00
    2017-06-13  RM3        4.00  12.00    5.00   0.00   0.00
    2017-06-14  RM1        0.00   0.00    0.00   0.00   0.00
    2017-06-14  RM2        0.00  20.00   12.00  10.00   0.00
    2017-06-14  RM3        0.00   9.00    7.00   0.00   10.00

【问题讨论】:

    标签: sql-server database multiplication select-query


    【解决方案1】:

    只需加入关键字段并使用ABS() 即可返回肯定结果。

    SELECT Q1.CPT, 
           Q1.Resource,
           ABS(Q1.[1] * Q2.[1]) as [1],
           ABS(Q1.[2] * Q2.[2]) as [2],
           ABS(Q1.[3] * Q2.[3]) as [3],
           ABS(Q1.[4] * Q2.[4]) as [4],
           ABS(Q1.[5] * Q2.[5]) as [5]
    FROM Query1 Q1
    JOIN Query2 Q2
      ON Q1.CPT = Q2.CPT
     AND Q1.Resourece = Q2.Resource
    

    【讨论】:

      【解决方案2】:

      你需要加入 CPT 和 Resource,返回 table1.1 * table2.1 为 1,像这样:

      SELECT t1.1 * t2.1 as 1 from t1 join t2 on t1.CPT = t2.CPT and t1.Resource = t2.Resource
      

      【讨论】:

        【解决方案3】:

        假设您有两个有问题的表分别为 t1 和 t2,那么您的查询应该是

        select 
            t1.CPT,
            t1.resource,
            ABS(t1.[1]*t2.[1]) as [1],
            ABS(t1.[2]*t2.[2]) as [2],
            ABS(t1.[3]*t2.[3]) as [3],
            ABS(t1.[4]*t2.[4]) as [4],
            ABS(t1.[5]*t2.[5]) as [5]
        from
            t1 join t2
                on t1.CPT=t2.CPt 
                and t1.resource=t2.resource
        

        如果您没有表 t1 和 t2,而这些是您的查询结果;请将您的查询封装为子查询,别名为 t1 和 t2

        select 
            t1.CPT,
            t1.resource,
            ABS(t1.[1]*t2.[1]) as [1],
            ABS(t1.[2]*t2.[2]) as [2],
            ABS(t1.[3]*t2.[3]) as [3],
            ABS(t1.[4]*t2.[4]) as [4],
            ABS(t1.[5]*t2.[5]) as [5]
        from
            --( your query 1) 
             t1 join 
            --( your query 2)
             t2
                on t1.CPT=t2.CPt 
                and t1.resource=t2.resource
        

        【讨论】:

          【解决方案4】:
          SELECT a.CPT
              , a.Resource 
              , ABS(a.Col1 * b.Col1) AS 'Col1'
              , ABS(a.Col2 * b.Col2) AS 'Col2'
              , ABS(a.Col3 * b.Col3) AS 'Col3'
              , ABS(a.Col4 * b.Col4) AS 'Col4'
              , ABS(a.Col5 * b.Col5) AS 'Col5'
          FROM Query1 AS a
              INNER JOIN Query2 AS b ON (a.CPT = b.CPT AND a.Resource = b.Resource)
          

          【讨论】:

            【解决方案5】:
            select Query1.CPT
                 , Query1.Resource
                 , Query1.1 * Query2.1 as 1
                 , Query1.2 * Query2.2 as 2
                 , Query1.3 * Query2.3 as 3
                 , Query1.4 * Query2.4 as 4
                 , Query1.5 * Query2.5 as 5 
            from Query1 
            Join Query2 on Query1.Resource= Query2.Resource
            

            这样试试,我现在没有sql server自己试试,可能需要对查询做一些修改。

            对于负值,您可以单独使用以下查询,也可以将其嵌入到主查询中。

            update NewTableName field = field * -1 where field < 0
            

            【讨论】:

            • 注意如果数字是正数乘以负数会怎样?
            • 它检查值是否小于0,然后才乘以“-1”。
            • 是的。由于某种原因错过了。
            【解决方案6】:

            你可以使用下面的简单连接

            Select q1.CPT, q1.[Resource]
                 , [1] = abs(q1.[1]*q2.[1])
                 , [2] = abs(q1.[2]*q2.[2])
                 , [3] = abs(q1.[3]*q2.[3])
                 , [4] = abs(q1.[4]*q2.[4])
                 , [5] = abs(q1.[5]*q2.[5])   
               from Query1 q1
               join Query2 q2
                 on q1.CPT = q2.CPT
                and q1.[Resource] = q2.[Resource]
            

            如果需要,将 query1 和 2 替换为您的子查询

            【讨论】:

              猜你喜欢
              • 2018-08-10
              • 1970-01-01
              • 1970-01-01
              • 2015-10-23
              • 1970-01-01
              • 2014-08-30
              • 1970-01-01
              • 2011-04-08
              • 1970-01-01
              相关资源
              最近更新 更多