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、组δ进行排序?