【问题标题】:Identify items and convert row to column in SQL在 SQL 中识别项目并将行转换为列
【发布时间】:2022-08-12 00:11:48
【问题描述】:

我试图找出员工在任何给定月份生产的除“鞋”之外的任何其他物品。使用我的代码,只要员工在该月生产“鞋子”,就会删除整行。任何帮助将不胜感激!。

她是样本数据:

create table tbl
(
  Employee  char,
  Month     varchar (6),
  Monday    varchar (6),
  Tuesday   varchar (6),
  Wednesday varchar (6),
);

insert into tbl values 
(\'A\',       \'May\'  ,    \'Shoe\',   \'\',        \'Cloth\'),
(\'A\',       \'March\',    \'Belt\',   \'Cloth\',   \'Hat\'),
(\'A\',       \'July\',     \'Belt\',   \'\',        \'\'),
(\'B\',       \'April\',    \'Shoe\',   \'\'  ,      \'Hat\'),
(\'A\',       \'June\',      \'\',      \'\'  ,      \'Mask\'),
(\'B\',       \'May\',      \'Shoe\',   \'\'  ,      \'\'),
(\'C\',       \'March\',    \'Hat\',    \'\',        \'Shoe\');

这是我使用的代码:

    select * 
    from   tbl
   where Monday not in (\'Shoe\') 
   and Tuesday not in (\'Shoe\') 
  and Wednesday not in (\'Shoe\')

以下是预期结果:

    标签: sql sql-server


    【解决方案1】:

    您可以通过 CROSS APPLYUNPIVOT 您的数据来简化这一点

    例子

    Select Employee
          ,Month
          ,B.*
     From  tbl A
     Cross Apply ( values ('Monday'   ,Monday   )
                         ,('Tuesday'  ,Tuesday  )
                         ,('Wednesday',Wednesday)
                 ) B(Day,Item)
     Where Item <> 'Shoe'
       and Item <> ''
    

    结果

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多