我的数据库中有一些记录,如下所示
公司 | 合同号 | 性别 | 月 | |||||
---|---|---|---|---|---|---|---|---|
英国独立电视台 | 续1 | 男 | 八月 | |||||
英国独立电视台 | 续1 | 男 | 二月 | |||||
英国独立电视台 | 续1 | 女 | 一月 | |||||
英国独立电视台 | 续1 | 男 | 十二月 | |||||
英国独立电视台 | 续1 | 女 | 四月 | |||||
C4 | 续1 | 男 | 九月 |
单独的数据看起来像这样 男性记录:
公司 | 合同号 | 性别 | 月 | |||||
---|---|---|---|---|---|---|---|---|
英国独立电视台 | 续1 | 男 | 八月 | |||||
英国独立电视台 | 续1 | 男 | 二月 | |||||
英国独立电视台 | 续1 | 男 | 十二月 | |||||
C4 | 续1 | 男 | 九月 |
女性记录
公司 | 合同号 | 性别 | 月 | |||||
---|---|---|---|---|---|---|---|---|
英国独立电视台 | 续1 | 女 | 一月 | |||||
英国独立电视台 | 续1 | 女 | 四月 |
我试图让数据看起来像这样,即同一家公司并排,合同号没有笛卡尔/交叉连接。
公司 | 合同号 | 男性 | 男月 | 女性 | 女月 | |||
---|---|---|---|---|---|---|---|---|
英国独立电视台 | 续1 | 男 | 八月 | 女 | 一月 | |||
英国独立电视台 | 续1 | 男 | 二月 | 女 | 四月 | |||
英国独立电视台 | 续1 | 男 | 十二月 | 空 | 空 | |||
C4 | 续1 | 男 | 九月 | 空 | 空 |
请问我缺少什么?
您正在寻找的想法是完整的外部连接。可以像下面这样实现。但您应该更仔细地考虑您的数据模型和您想要做什么。 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
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;