应用计算并返回没有联盟的另一行

时间:2014-05-13 15:51:50

标签: sql sql-server row

例如,我的表数据如下所示:

       ID  intValue  date
       1   5         1/1/1
       1   10        22/22/22

我想要做的是将每个intValue实例的intValue列乘以5,10和15。

所以我的结果集就像:

       ID  intValue  date
       1   25         1/1/1
       1   50         1/1/1
       1   75         1/1/1
       1   50         22/22/22
       1   100        22/22/22
       1   150        22/22/22

我如何获得这样的结果集?

qxg's answer下面最准确地回答了如何最好地处理上述问题。另一种操纵数据的方法,以及我使用它的方法是:

SELECT CASE WHEN CrossTable.Value = 5 THEN 'By Five!' 
WHEN CrossTable.Value = 10 Then 'By Ten!'
WHEN CrossTable.Value = 15 Then 'By Fifteen!' END AS ByWhat,
CrossTable.Value As Base Value,
intValue * CrossTable.Value
FROM table1
CROSS JOIN (VALUES (5), (10), (15)) CrossTAble(Value)

3 个答案:

答案 0 :(得分:3)

利用CROSS JOIN和值

SELECT ID, table1.intValue * Val.N, date
FROM table1
CROSS JOIN (VALUES (5), (10), (15)) Val(N)

答案 1 :(得分:1)

此解决方案仅使用单个union,而不是将表合并到自身:

WITH    numbers
          AS ( SELECT   5 AS n
               UNION ALL
               SELECT   n + 5
               FROM     numbers
               WHERE    n + 5 <= 15
             )
    SELECT  id ,
            intValue + n AS intValue ,
            date
    FROM    numbers
            CROSS JOIN your_table

该解决方案仅限于提供可以数学表达的序列。但是,它的优点是只需稍微调整运行时通过变量提供的值的数量。

答案 2 :(得分:1)

SELECT A.ID, A.intValue*5*B.number intValue, A.[date]
FROM YourTable A
CROSS JOIN (SELECT *
            FROM master.dbo.spt_values
            WHERE type = 'P'
            AND number BETWEEN 1 AND 3) B