我有下面三张桌子:

Table A

Client Consumption1 Consumption2 ... Consumption28
4587 325442 67420 ... 364855
1056 104687 35879 ... 8764501
8977 485236 68743 ... 477285

Table B

Client Arrive1 Arrive2 ... Arrive28
4587 926842 474230 ... 634875
1278 154327 956948 ... 84868
8977 694826 2587474 ... 87547

Table C

Client Stock1 Stock2 ... Stock28
4587 282 423 ... 875
1056 153 948 ... 886
8977 694 874 ... 854

我想要一张这样的桌子:

Client Stock Consumption Arrive
4587 282 325442 926842
4587 423 67420 474230
4587 ... ... ...
4587 875 364855 634875
8977 694 485236 694826
8977 874 68743 474230
8977 ... ... ...
8977 854 477285 634875

我try 下一个代码:

CREATE TABLE FINAL_TB AS (
                          SELECT CLIENT FROM TABLE_A );

ALTER TABLE FINAL_TB ADD STOCK FLOAT(20);

INSERT INTO FINAL_TB(STOCK) SELECT TABLE_C.STOCK1 FROM TABLE_C 
                            UNION ALL 
                            SELECT TABLE_C.STOCK2 FROM TABLE_C
                            ...
                            UNION ALL 
                            SELECT TABLE_C.STOCK28 FROM TABLE_C;                         

但我没有得到我想要的结果,而且代码太广泛了.有什么帮助吗?

推荐答案

我创建了一些带有随机值的临时表,以说明:

create table #A
(
    Client int,
    Consumption1 int,
    Consumption2 int,
    Consumption3 int,
    Consumption4 int,
    Consumption5 int,
    Consumption6 int,
    Consumption7 int,
    Consumption8 int,
    Consumption9 int,
    Consumption10 int,
    Consumption11 int,
    Consumption12 int,
    Consumption13 int,
    Consumption14 int,
    Consumption15 int,
    Consumption16 int,
    Consumption17 int,
    Consumption18 int,
    Consumption19 int,
    Consumption20 int,
    Consumption21 int,
    Consumption22 int,
    Consumption23 int,
    Consumption24 int,
    Consumption25 int,
    Consumption26 int,
    Consumption27 int,
    Consumption28 int
)

create table #B
(
    Client int,
    Arrive1 int,
    Arrive2 int,
    Arrive3 int,
    Arrive4 int,
    Arrive5 int,
    Arrive6 int,
    Arrive7 int,
    Arrive8 int,
    Arrive9 int,
    Arrive10 int,
    Arrive11 int,
    Arrive12 int,
    Arrive13 int,
    Arrive14 int,
    Arrive15 int,
    Arrive16 int,
    Arrive17 int,
    Arrive18 int,
    Arrive19 int,
    Arrive20 int,
    Arrive21 int,
    Arrive22 int,
    Arrive23 int,
    Arrive24 int,
    Arrive25 int,
    Arrive26 int,
    Arrive27 int,
    Arrive28 int
)

create table #C
(
    Client int,
    Stock1 int,
    Stock2 int,
    Stock3 int,
    Stock4 int,
    Stock5 int,
    Stock6 int,
    Stock7 int,
    Stock8 int,
    Stock9 int,
    Stock10 int,
    Stock11 int,
    Stock12 int,
    Stock13 int,
    Stock14 int,
    Stock15 int,
    Stock16 int,
    Stock17 int,
    Stock18 int,
    Stock19 int,
    Stock20 int,
    Stock21 int,
    Stock22 int,
    Stock23 int,
    Stock24 int,
    Stock25 int,
    Stock26 int,
    Stock27 int,
    Stock28 int
)

insert into #A values
(4587, 1897163, 1750380, 5487230, 5086290, 3232280, 6014338, 5978823, 5864160, 8462496, 3945424, 6641780, 6268308, 924802, 9246014, 8089559, 6079526, 7332457, 4971714, 379325, 1651062, 5878994, 4987033, 9802665, 8163241, 180040, 3309288, 6966085, 6791869),
(1056, 3693126, 6085435, 2576225, 906414, 9308827, 7912118, 4690652, 2298023, 5333767, 1550576, 3324191, 8750357, 2135258, 3403408, 6807101, 1750717, 8367234, 5176016, 1008922, 9641689, 3564379, 5398274, 4521049, 5767916, 779819, 5466675, 4020480, 7245496),
(8977, 6496397, 7097447, 5026248, 3686617, 4583368, 4018366, 5718120, 318667, 2281474, 4044423, 9424092, 5355506, 7723824, 8635663, 7122301, 3401243, 2478769, 6540496, 8370652, 268827, 8858460, 4468893, 2184993, 416313, 5099858, 170593, 6609073, 7137023)

insert into #B values
(4587, 2667122, 2542268, 1118532, 2284504, 2147917, 1084679, 2729616, 1175793, 2649496, 1699428, 507390, 108714, 828544, 1358961, 1754942, 2084233, 1964319, 1751282, 2047706, 705322, 2918377, 1001676, 1494300, 2937679, 2216776, 2485884, 1217744, 366044),
(1056, 213746, 483120, 1689874, 2063834, 473576, 2063958, 2212633, 819822, 1569991, 1159024, 479248, 495937, 1923624, 1557142, 1164307, 2669944, 2161610, 1187291, 1083194, 1947235, 136211, 1749596, 692847, 1947817, 207300, 2784799, 2061996, 1248644),
(8977, 2085112, 2935995, 1977982, 633723, 2426369, 1156016, 1011041, 470338, 926361, 1244144, 625813, 945190, 1217648, 376607, 89393, 2944627, 1118893, 2939117, 213832, 2269515, 2261478, 1637021, 1961149, 1145781, 206511, 1563378, 1272576, 212847)

insert into #C values
(4587, 806, 797, 310, 784, 411, 629, 966, 134, 963, 313, 160, 136, 620, 690, 945, 649, 718, 207, 457, 125, 311, 911, 799, 629, 404, 510, 650, 793),
(1056, 599, 411, 843, 311, 752, 560, 797, 304, 805, 289, 476, 535, 315, 336, 805, 487, 820, 125, 589, 269, 415, 409, 329, 245, 316, 737, 561, 176),
(8977, 841, 583, 833, 372, 374, 776, 152, 676, 854, 404, 517, 571, 694, 315, 315, 116, 163, 948, 598, 681, 226, 691, 684, 372, 450, 772, 646, 581)

例如,如果您知道每个可能的Client值都会存在于消耗表中,则只需对字段求和并连接表即可:

select 
    con.Client,
    sto.Stock1 + sto.Stock2 + sto.Stock3 + sto.Stock4 + sto.Stock5 + sto.Stock6 + sto.Stock7 + sto.Stock8 + sto.Stock9 + sto.Stock10 + sto.Stock11 + sto.Stock12 + sto.Stock13 + sto.Stock14 + sto.Stock15 + sto.Stock16 + sto.Stock17 + sto.Stock18 + sto.Stock19 + sto.Stock20 + sto.Stock21 + sto.Stock22 + sto.Stock23 + sto.Stock24 + sto.Stock25 + sto.Stock26 + sto.Stock27 + sto.Stock28 as Stock,
    con.Consumption1 + con.Consumption2 + con.Consumption3 + con.Consumption4 + con.Consumption5 + con.Consumption6 + con.Consumption7 + con.Consumption8 + con.Consumption9 + con.Consumption10 + con.Consumption11 + con.Consumption12 + con.Consumption13 + con.Consumption14 + con.Consumption15 + con.Consumption16 + con.Consumption17 + con.Consumption18 + con.Consumption19 + con.Consumption20 + con.Consumption21 + con.Consumption22 + con.Consumption23 + con.Consumption24 + con.Consumption25 + con.Consumption26 + con.Consumption27 + con.Consumption28 as Consumption,
    arr.Arrive1 + arr.Arrive2 + arr.Arrive3 + arr.Arrive4 + arr.Arrive5 + arr.Arrive6 + arr.Arrive7 + arr.Arrive8 + arr.Arrive9 + arr.Arrive10 + arr.Arrive11 + arr.Arrive12 + arr.Arrive13 + arr.Arrive14 + arr.Arrive15 + arr.Arrive16 + arr.Arrive17 + arr.Arrive18 + arr.Arrive19 + arr.Arrive20 + arr.Arrive21 + arr.Arrive22 + arr.Arrive23 + arr.Arrive24 + arr.Arrive25 + arr.Arrive26 + arr.Arrive27 + arr.Arrive28 as Arrive
from #A con
left join #B arr on con.Client = arr.Client
left join #C sto on con.Client = sto.Client

如果一个客户端可能只存在于一个或两个表中,而您不知道是哪一个(S),那么您需要首先区分客户端列表:

select
    cli.Client,
    sto.Stock1 + sto.Stock2 + sto.Stock3 + sto.Stock4 + sto.Stock5 + sto.Stock6 + sto.Stock7 + sto.Stock8 + sto.Stock9 + sto.Stock10 + sto.Stock11 + sto.Stock12 + sto.Stock13 + sto.Stock14 + sto.Stock15 + sto.Stock16 + sto.Stock17 + sto.Stock18 + sto.Stock19 + sto.Stock20 + sto.Stock21 + sto.Stock22 + sto.Stock23 + sto.Stock24 + sto.Stock25 + sto.Stock26 + sto.Stock27 + sto.Stock28 as Stock,
    con.Consumption1 + con.Consumption2 + con.Consumption3 + con.Consumption4 + con.Consumption5 + con.Consumption6 + con.Consumption7 + con.Consumption8 + con.Consumption9 + con.Consumption10 + con.Consumption11 + con.Consumption12 + con.Consumption13 + con.Consumption14 + con.Consumption15 + con.Consumption16 + con.Consumption17 + con.Consumption18 + con.Consumption19 + con.Consumption20 + con.Consumption21 + con.Consumption22 + con.Consumption23 + con.Consumption24 + con.Consumption25 + con.Consumption26 + con.Consumption27 + con.Consumption28 as Consumption,
    arr.Arrive1 + arr.Arrive2 + arr.Arrive3 + arr.Arrive4 + arr.Arrive5 + arr.Arrive6 + arr.Arrive7 + arr.Arrive8 + arr.Arrive9 + arr.Arrive10 + arr.Arrive11 + arr.Arrive12 + arr.Arrive13 + arr.Arrive14 + arr.Arrive15 + arr.Arrive16 + arr.Arrive17 + arr.Arrive18 + arr.Arrive19 + arr.Arrive20 + arr.Arrive21 + arr.Arrive22 + arr.Arrive23 + arr.Arrive24 + arr.Arrive25 + arr.Arrive26 + arr.Arrive27 + arr.Arrive28 as Arrive
from
(
    select con.Client from #A con
    union
    select arr.Client from #B arr
    union
    select sto.Client from #C sto
) cli
left join #A con on cli.Client = con.Client
left join #B arr on cli.Client = arr.Client
left join #C sto on cli.Client = sto.Client

然而,正如 comments 中指出的那样,这个表的设计似乎相当糟糕,可能应该更改,例如:

Client ValueNumber Consumption
4587 1 1897163
4587 2 1750380
4587 3 5487230
4587 4 5086290
4587 5 3232280
4587 6 6014338
4587 7 5978823
4587 8 5864160
4587 9 8462496
4587 10 3945424
4587 11 6641780
4587 12 6268308
4587 13 924802
4587 14 9246014
4587 15 8089559
4587 16 6079526
4587 17 7332457
4587 18 4971714
4587 19 379325
4587 20 1651062
4587 21 5878994
4587 22 4987033
4587 23 9802665
4587 24 8163241
4587 25 180040
4587 26 3309288
4587 27 6966085
4587 28 6791869
1056 1 3693126
1056 2 6085435
1056 3 2576225
1056 4 906414
1056 5 9308827
1056 6 7912118
1056 7 4690652
1056 8 2298023
1056 9 5333767
1056 10 1550576
1056 11 3324191
1056 12 8750357
1056 13 2135258
1056 14 3403408
1056 15 6807101
1056 16 1750717
1056 17 8367234
1056 18 5176016
1056 19 1008922
1056 20 9641689
1056 21 3564379
1056 22 5398274
1056 23 4521049
1056 24 5767916
1056 25 779819
1056 26 5466675
1056 27 4020480
1056 28 7245496
8977 1 6496397
8977 2 7097447
8977 3 5026248
8977 4 3686617
8977 5 4583368
8977 6 4018366
8977 7 5718120
8977 8 318667
8977 9 2281474
8977 10 4044423
8977 11 9424092
8977 12 5355506
8977 13 7723824
8977 14 8635663
8977 15 7122301
8977 16 3401243
8977 17 2478769
8977 18 6540496
8977 19 8370652
8977 20 268827
8977 21 8858460
8977 22 4468893
8977 23 2184993
8977 24 416313
8977 25 5099858
8977 26 170593
8977 27 6609073
8977 28 7137023

甚至:

Client ValueNumber Stock Consumption Arrive
4587 1 806 1897163 2667122
4587 2 797 1750380 2542268
4587 3 310 5487230 1118532
4587 4 784 5086290 2284504
4587 5 411 3232280 2147917
4587 6 629 6014338 1084679
4587 7 966 5978823 2729616
4587 8 134 5864160 1175793
4587 9 963 8462496 2649496
4587 10 313 3945424 1699428
4587 11 160 6641780 507390
4587 12 136 6268308 108714
4587 13 620 924802 828544
4587 14 690 9246014 1358961
4587 15 945 8089559 1754942
4587 16 649 6079526 2084233
4587 17 718 7332457 1964319
4587 18 207 4971714 1751282
4587 19 457 379325 2047706
4587 20 125 1651062 705322
4587 21 311 5878994 2918377
4587 22 911 4987033 1001676
4587 23 799 9802665 1494300
4587 24 629 8163241 2937679
4587 25 404 180040 2216776
4587 26 510 3309288 2485884
4587 27 650 6966085 1217744
4587 28 793 6791869 366044
1056 1 599 3693126 213746
1056 2 411 6085435 483120
1056 3 843 2576225 1689874
1056 4 311 906414 2063834
1056 5 752 9308827 473576
1056 6 560 7912118 2063958
1056 7 797 4690652 2212633
1056 8 304 2298023 819822
1056 9 805 5333767 1569991
1056 10 289 1550576 1159024
1056 11 476 3324191 479248
1056 12 535 8750357 495937
1056 13 315 2135258 1923624
1056 14 336 3403408 1557142
1056 15 805 6807101 1164307
1056 16 487 1750717 2669944
1056 17 820 8367234 2161610
1056 18 125 5176016 1187291
1056 19 589 1008922 1083194
1056 20 269 9641689 1947235
1056 21 415 3564379 136211
1056 22 409 5398274 1749596
1056 23 329 4521049 692847
1056 24 245 5767916 1947817
1056 25 316 779819 207300
1056 26 737 5466675 2784799
1056 27 561 4020480 2061996
1056 28 176 7245496 1248644
8977 1 841 6496397 2085112
8977 2 583 7097447 2935995
8977 3 833 5026248 1977982
8977 4 372 3686617 633723
8977 5 374 4583368 2426369
8977 6 776 4018366 1156016
8977 7 152 5718120 1011041
8977 8 676 318667 470338
8977 9 854 2281474 926361
8977 10 404 4044423 1244144
8977 11 517 9424092 625813
8977 12 571 5355506 945190
8977 13 694 7723824 1217648
8977 14 315 8635663 376607
8977 15 315 7122301 89393
8977 16 116 3401243 2944627
8977 17 163 2478769 1118893
8977 18 948 6540496 2939117
8977 19 598 8370652 213832
8977 20 681 268827 2269515
8977 21 226 8858460 2261478
8977 22 691 4468893 1637021
8977 23 684 2184993 1961149
8977 24 372 416313 1145781
8977 25 450 5099858 206511
8977 26 772 170593 1563378
8977 27 646 6609073 1272576
8977 28 581 7137023 212847

在这种情况下,您的查询将变得简单得多:

select
    Client,
    sum(Stock) as Stock,
    sum(Consumption) as Consumption,
    sum(Arrive) as Arrive
from combined_table
group by Client

Sql相关问答推荐

如何并行SELECT和RESET?

对于表A中的每一行,更新表B中与金额有关的行

获取每5分钟时间间隔的总和

使用来自不同深度的嵌套组的值执行计算的干净方法?

基于多个字段删除Access中的重复记录,同时保留最低优先级

值对于类型字符来说太长

判断序列索引处的序列是否完整

从数据库中查找总和大于或等于查询中的数字的数字

对于多字节字符,SQL Server中的DATALENGTH返回1字节

根据是否出现过零来筛选数据(跨多行)

用VB.NET在Dapper中实现MS Access数据库顺序透视

使用与JOIN一起使用的查询后进行分页和排序

如何解决错误;ORA-00911:无效字符;在果朗?

替换SQL Server XML中多处出现的 node 值

PostgreSQL:从多个字段收集特定指标的最后一个条目

PostgreSQL 中将数据从 JSONB 类型转换为 Array 类型

SQL:考虑合并分支计算分支的增长百分比

如何在 ClickHouse SQL 中使用 CTE 将邻居语句中的数字作为偏移量传递?

SQL查询以获取从特定可变日期看到的用户

在给定列中具有特定值的行与 SQL 中的总行数的比率