T-SQL 查询并排显示记录

问题描述 投票:0回答:2

我的数据库中有一些记录,如下所示

公司 合同号 性别
英国独立电视台 续1 八月
英国独立电视台 续1 二月
英国独立电视台 续1 一月
英国独立电视台 续1 十二月
英国独立电视台 续1 四月
C4 续1 九月

单独的数据看起来像这样 男性记录:

公司 合同号 性别
英国独立电视台 续1 八月
英国独立电视台 续1 二月
英国独立电视台 续1 十二月
C4 续1 九月

女性记录

公司 合同号 性别
英国独立电视台 续1 一月
英国独立电视台 续1 四月

我试图让数据看起来像这样,即同一家公司并排,合同号没有笛卡尔/交叉连接。

公司 合同号 男性 男月 女性 女月
英国独立电视台 续1 八月 一月
英国独立电视台 续1 二月 四月
英国独立电视台 续1 十二月
C4 续1 九月

请问我缺少什么?

t-sql pivot-table
2个回答
0
投票

您正在寻找的想法是完整的外部连接。可以像下面这样实现。但您应该更仔细地考虑您的数据模型和您想要做什么。 FULL OUTER JOIN 在其他一些上下文中可能很有用。

SELECT COALESCE( MaleRecords.Company, FemaleRecords.Company) Company
, COALESCE(MaleRecords.ContractNo, FemaleRecords.ContractNo ) ContractNo
, MaleRecords.Gender MaleGender
, MaleRecords.Month  MaleMonth
, FemaleRecords.Gender FemaleGender
, FemaleRecords.Month  FemaleMonth
, ...
FROM (
  SELECT Company, ContractNo, Gender, Month, ...
  , ROW_NUMBER() OVER (PARTITION BY Company, ContractNo ORDER BY Month) RowNumber
  FROM <Table>
  WHERE Gender = 'male'
  ) MaleRecords
  FULL OUTER JOIN (
  SELECT Company, ContractNo, Gender, Month, ...
  , ROW_NUMBER() OVER (PARTITION BY Company, ContractNo ORDER BY Month) RowNumber
  FROM <Table>
  WHERE Gender = 'female'
  ) FemaleRecords
  on MaleRecords.Company = FemaleRecords.Company
  and MaleRecords.ContractNo = FemaleRecords.ContractNo
  and MaleRecords.RowNumber = FemaleRecords.RowNumber

0
投票
with data as (
  select Company, ContractNo, Gender, Month, row_number() over (partition by Company,ContractNo,Gender 
  order by case 
       when Month='jan' then 1
       when Month='feb' then 2
       when Month='mar' then 3
       when Month='apr' then 4
       when Month='may' then 5
       when Month='jun' then 6
       when Month='jul' then 7
       when Month='aug' then 8
       when Month='sep' then 9
       when Month='nov' then 10
       when Month='oct' then 11
       when Month='dec' then 12
       end
      ) as RowNo
from myTable),
  maleData as (select Company, ContractNo, Gender, Month, RowNo 
      from data 
      where Gender = 'male'),
  femaleData as (select Company, ContractNo, Gender, Month, RowNo 
      from data
      where Gender = 'female')
select coalesce(m.Company, f.Company) Company,
  coalesce(m.ContractNo, f.ContractNo) ContractNo,
  m.Gender MaleGender, 
  m.Month MaleMont,
  f.Gender FemaleGender, 
  f.Month FemaleMonth
from maleData m
  full join femaleData f on m.Company = f.Company and
    m.ContractNo = f.ContractNo and
    m.RowNo = f.RowNo;

DBFiddle 演示

© www.soinside.com 2019 - 2024. All rights reserved.