SQL:生成“计算行”

SQL:生成“计算行”,sql,Sql,我有一张像这样的桌子 TYPE | A | B | C | ... | Z one | 4 | 4 | 4 | ... | 4 two | 3 | 2 | 2 | ... | 1 我想插入一行,计算第1行减去第2行: TYPE | A | B | C | ... | Z one | 4 | 4 | 4 | ... | 4 two | 3 | 2 | 2 | ... | 1 delta| 1 | 2 | 2 | ... | 3 我正在考虑一个SQL命令,它看起来像 (select A

我有一张像这样的桌子

TYPE | A | B | C | ... | Z
one  | 4 | 4 | 4 | ... | 4
two  | 3 | 2 | 2 | ... | 1
我想插入一行,计算第1行减去第2行:

TYPE | A | B | C | ... | Z
one  | 4 | 4 | 4 | ... | 4
two  | 3 | 2 | 2 | ... | 1
delta| 1 | 2 | 2 | ... | 3
我正在考虑一个SQL命令,它看起来像

(select A from table where type=one) - (select A from table where type=two)
不利的一面是,它太长了,我还必须对所有的A-Z列这样做,这相当多

我相信有一种更优雅的方式可以做到这一点

附言:

我的代码顺序如下所示:

// I'm inserting the data from a RawTable to a TempTable

INSERT one
INSERT two
INSERT delta
INSERT three
INSERT four
INSERT delta
...
INSERT onehundredone
INSERT onehundredtwo
INSERT delta

我不知道有什么方法可以轻松做到这一点,也就是说,不必指定每一列,我想不出任何方法可以轻松做到这一点,所以我会记录在案,说这是不可能做到的。很容易

不容易的方法是构建动态代码—循环数据库元数据,构建包含语句的字符串,逐列执行所需例程,然后执行该字符串。你真的希望尽可能避免这种情况


一种快捷方式是,如果您只需要构建一个执行此操作的过程或函数,即构建一次运行多次,则可以将列列表复制到Excel电子表格中,使用引用列名的forumlas构建高度重复的语句,然后将结果复制回来。这比解释要简单得多。

我不知道你为什么这么做,但我的方法是:

insert into table
select 'delta', 
t1.a - t2.a, 
t1.b - t2.b
.....
from table t1, 
table t2
where t1.type = 'one'
and t2.type = 'two'
您必须在插入1和2后立即运行此查询,然后在插入3和4后重新运行它。讨厌的


如果可以以某种方式重新命名列,或创建数字列,则可以在单个查询中运行该列。

当您将一个替换为1,两个替换为2,依此类推时,此sql可能会起作用:

INSERT INTO PodMays
SELECT
  "Delta", A.A-B.A, A.B-B.B, A.C-B.C, A.D-B.D, A.E-B.E
FROM
  (
    SELECT TOP 1
      * 
    FROM
      (SELECT TOP 2 * FROM PodMays WHERE Type <> "Delta" ORDER BY Type DESC)
    ORDER BY
      Type ASC
  ) AS A,
  (
    SELECT TOP 1 
      * 
    FROM 
      (SELECT TOP 2 * FROM PodMays WHERE Type <> "Delta" ORDER BY Type DESC)
    ORDER BY 
      Type DESC
  ) AS B

我已经在临时表中添加了一个标识为的ID列。您可以使用它来确定应该对哪些行进行分组

create table YourTable
(
  ID int identity primary key,
  [TYPE] varchar(20),
  A int,
  B int,
  C int
)

insert into YourTable ([TYPE], A, B, C)
select 'one',   4, 4, 4 union all
select 'two',   3, 2, 2 union all
select 'three', 7, 4, 4 union all
select 'four',  3, 2, 2 union all
select 'five',  8, 4, 4 union all
select 'six',   3, 2, 2


select T.[TYPE], T.A, T.B, T.C
from
  (
    select
      T.ID,
      T.[TYPE],
      T.A,
      T.B,
      T.C
    from YourTable as T  
    union all  
    select
      T2.ID,
      'delta' as [TYPE],
      T1.A-T2.A as A,
      T1.B-T2.B as B,
      T1.C-T2.C as C
    from YourTable as T1
      inner join YourTable as T2
        on T1.ID = T2.ID-1 and
           T2.ID % 2 = 0
  ) as T
order by T.ID, case T.[TYPE] when 'delta' then 1 else 0 end
结果:

TYPE                 A           B           C
-------------------- ----------- ----------- -----------
one                  4           4           4
two                  3           2           2
delta                1           2           2
three                7           4           4
four                 3           2           2
delta                4           2           2
five                 8           4           4
six                  3           2           2
delta                5           2           2
从组中的第一行开始在C列上排序:

select T.[TYPE], T.A, T.B, T.C
from
  (
    select
      T1.ID,
      T1.[TYPE],
      case T1.ID % 2 when 1 then T1.C else T2.C end as Sortorder,
      T1.A,
      T1.B,
      T1.C
    from YourTable as T1
      left outer join YourTable as T2
        on T1.ID = T2.ID+1  
    union all  
    select
      T2.ID,
      'delta' as [TYPE],
      T1.C as Sortorder,
      T1.A-T2.A as A,
      T1.B-T2.B as B,
      T1.C-T2.C as C
    from YourTable as T1
      inner join YourTable as T2
        on T1.ID = T2.ID-1 and
           T2.ID % 2 = 0
  ) as T
order by T.Sortorder, T.ID, case T.[TYPE] when 'delta' then 1 else 0 end

您可能不想存储这些数据,只想将其包含在结果集中?此外,我认为您的编号在…中出现了偏差,因为如果您是成对工作的,那么100个done和100个two应该是一对。我将其存储到临时表中,然后将其绑定到gridview。是的,应该是102,我只是强调了行数。对我来说,听起来像是UI问题。。。您可能可以使用SQL来完成这项工作—您没有提到您正在使用的SQL产品或版本,但如果您扩展数据网格以实现所需的功能,它可能会工作得更好。这是因为我必须显示一个类似这样的报告。从数据库中获取数据对,然后显示增量。然后对其他人也这样做。所以我要做的是将所有内容存储在一个临时表中,然后将其绑定到一个gridview。或者有更好的方法吗?好吧,你可以在前端完成-但是你的解决方案听起来和其他任何解决方案一样合理…你需要想出一种方法来排序结果集,并在正确的位置插入增量行。另外还有一种方法可以让它准确地显示出来!我可以问你另一个问题吗?是否可以根据C列和该组第1行的值对组1、组2、组δ进行排序?