【问题标题】:SQL update with hard-coded column names使用硬编码的列名进行 SQL 更新
【发布时间】:2015-12-20 15:30:39
【问题描述】:

我需要帮助为以下示例创建 SQL 更新(带有示例数据):

表 1:详细信息 结构:VENDOR CHAR(10)、EMPLOYEE CHAR(10)、WEEK INT

VENDOR   EMPLOYEE      WEEK
VEN01       EMP01         1
VEN01       EMP01         1
VEN02       EMP03         1
VEN03       EMP02         1
VEN01       EMP01         2
VEN01       EMP01         2
VEN01       EMP03         2
VEN03       EMP02         2
VEN02       EMP01         3
VEN02       EMP01         3
VEN02       EMP03         3
VEN03       EMP03         3

表 2:SUMMARTRAN(需要更新)

结构:WEEK01 INT、WEEK02 INT、WEEK03 INT、VENDOR CHAR(10)、EMPLOYEE CHAR(10) SQL 更新此表 (SUMMARTRAN) 的结果应如下所示:

WEEK01     WEEK02    WEEK03    VENDOR   EMPLOYEE
2          3         0         VEN01
1          0         3         VEN02
1          1         1         VEN03
2          2         2                  EMP01
1          1         0                  EMP02
1          1         2                  EMP03

【问题讨论】:

  • 您要添加新记录还是更新现有记录?
  • @DanBracuk 将新记录添加到空表中。也就是说,我认为我会先截断 SUMMARTRAN,然后从 DETAILTRAN 中添加记录

标签: sql sql-server


【解决方案1】:

您可以使用grouping sets 和条件聚合来解决此问题:

select vendor, employee,
       sum(case when week = 1 then 1 else 0 end) as week01,
       sum(case when week = 2 then 1 else 0 end) as week02,
       sum(case when week = 3 then 1 else 0 end) as week03
from DETAILTRAN
group by grouping sets ((vendor), (employee));

您可以将其合并到insert,summartran 的声明中:

insert into summertran(vendor, employee, week01, week02, week03)
    select vendor, employee,
           sum(case when week = 1 then 1 else 0 end) as week01,
           sum(case when week = 2 then 1 else 0 end) as week02,
           sum(case when week = 3 then 1 else 0 end) as week03
    from DETAILTRAN
    group by grouping sets ((vendor), (employee));

【讨论】:

  • 从未听说过Grouping set。感谢分享:)这里是Demo
  • 戈登,谢谢。我也从未听说过分组集(但我是 SQL 新手)。 VR46,谢谢你的演示。
【解决方案2】:

试试这个

with VENDOR as
(
select isnull(count(case when WEEK = 1 then WEEK end),0) WEEK01,
       isnull(count(case when WEEK = 2 then WEEK end),0) WEEK02 ,  
       isnull(count(case when WEEK = 3 then WEEK end),0) WEEK03 ,
VENDOR
from DETAILTRAN 
group by VENDOR
),EMPLOYEE as
(
select isnull(count(case when WEEK = 1 then WEEK end),0) WEEK01,
       isnull(count(case when WEEK = 2 then WEEK end),0) WEEK02 ,  
       isnull(count(case when WEEK = 3 then WEEK end),0) WEEK03 ,
EMPLOYEE
from DETAILTRAN 
group by EMPLOYEE
)
select WEEK01, WEEK02, WEEK03, VENDOR, EMPLOYEE = '' from VENDOR 
union all
select WEEK01, WEEK02, WEEK03, VENDOR='', EMPLOYEE from EMPLOYEE

要将结果更新为SUMMARTRAN 表,请使用此

with VENDOR as
(
select isnull(count(case when WEEK = 1 then WEEK end),0) WEEK01,
       isnull(count(case when WEEK = 2 then WEEK end),0) WEEK02 ,  
       isnull(count(case when WEEK = 3 then WEEK end),0) WEEK03 ,
VENDOR
from DETAILTRAN 
group by VENDOR
),EMPLOYEE as
(
select isnull(count(case when WEEK = 1 then WEEK end),0) WEEK01,
       isnull(count(case when WEEK = 2 then WEEK end),0) WEEK02 ,  
       isnull(count(case when WEEK = 3 then WEEK end),0) WEEK03 ,
EMPLOYEE
from DETAILTRAN 
group by EMPLOYEE
)
insert into  SUMMARTRAN (WEEK01, WEEK02, WEEK03, VENDOR, EMPLOYEE)
select WEEK01, WEEK02, WEEK03, VENDOR, EMPLOYEE = '' from VENDOR 
union all
select WEEK01, WEEK02, WEEK03, VENDOR='', EMPLOYEE from EMPLOYEE

【讨论】:

  • VR46,首先,谢谢。我不明白的是您的代码中第二个表(SUMMARTRAN)的更新在哪里?
  • Insert 就是我所说的更新。我在第二个查询中添加了insert into..
  • VR46,非常感谢。现在我只需要弄清楚上述哪种方法更快。
  • @Hidalgo - 毫无疑问,Gordan 的方法会更快
  • VR46,谢谢。但是你的例子对我来说是一个很好的学习。我对您如何快速创建 SQL Fiddle 演示印象深刻(也需要学习这个工具)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2020-05-28
相关资源
最近更新 更多