如何在一个很长的表中聚合相似的列?

时间:2014-06-23 09:10:05

标签: sql aggregate

我有一个非常困难的问题,我不知道如何处理它。我很乐意收到一些建议。

我有一张很长的桌子,其中包含有关特定住宅居民的详细信息。有些栏目对所有居民都很常见,有些则是个人。区别在于一组数字。例如 - 包含01(CarMake01,Phone01等)的所有字段代表第一个人。包含02的所有字段代表第二人,依此类推。没有数字的领域很常见(城市,街道等)。

我的目标是运行一个查询,该查询接受这个长表并创建一个新表,其中只包含公共字段和包含特定数字(01,02等)的字段。这是当前表的代码。我希望我足够清楚。我应该使用枢轴还是其他功能?

CREATE TABLE [dbo].[FamiliesStageA](
    [Hhid] [int] NOT NULL,
    [AssignedUser] [int] NULL,
    [Hhphone] [nvarchar](11) NULL,
    [FamilyName] [nvarchar](50) NULL,
    [City] [int] NULL,
    [Street] [int] NULL,
    [HouseNum] [int] NULL,
    [Hhsize] [int] NULL,
    [NumCar] [int] NULL,
    [CarYear] [int] NULL,
    [CarMake01] [int] NULL,
    [CarMake02] [int] NULL,
    [CarMake03] [int] NULL,
    [CarMake04] [int] NULL,
    [CarMake05] [int] NULL,
    [CarModel01] [int] NULL,
    [CarModel02] [int] NULL,
    [CarModel03] [int] NULL,
    [CarModel04] [int] NULL,
    [CarModel05] [int] NULL,
    [PersonID01] [int] NULL,
    [PersonID02] [int] NULL,
    [PersonID03] [int] NULL,
    [PersonID04] [int] NULL,
    [PersonID05] [int] NULL,
    [PersonID06] [int] NULL,
    [PersonID07] [int] NULL,
    [PersonID08] [int] NULL,
    [PesonID09] [int] NULL,
    [PesonID10] [int] NULL,
    [PersonID11] [int] NULL,
    [PersonID12] [int] NULL,
    [PersonID13] [int] NULL,
    [PersonID14] [int] NULL,
    [PersonID15] [int] NULL,
    [Phone01] [int] NULL,
    [Phone02] [int] NULL,
    [Phone03] [int] NULL,
    [Phone04] [int] NULL,
    [Phone05] [int] NULL,
    [Phone06] [int] NULL,
    [Phone07] [int] NULL,
    [Phone08] [int] NULL,
    [Phone09] [int] NULL,
    [Phone10] [int] NULL,
    [Phone11] [int] NULL,
    [Phone12] [int] NULL,
    [Phone13] [int] NULL,
    [Phone14] [int] NULL,
    [Phone15] [int] NULL,
    [FirstName01] [int] NULL,
    [FirstName02] [int] NULL,
    [FirstName03] [int] NULL,
    [FirstName04] [int] NULL,
    [FirstName05] [int] NULL,
    [FirstName06] [int] NULL,
    [FirstName07] [int] NULL,
    [FirstName08] [int] NULL,
    [FirstName09] [int] NULL,
    [FirstName10] [int] NULL,
    [FirstName11] [int] NULL,
    [FirstName12] [int] NULL,
    [FirstName13] [int] NULL,
    [FirstName14] [int] NULL,
    [FirstName15] [int] NULL,
    [SleepHome01] [int] NULL,
    [SleepHome02] [int] NULL,
    [SleepHome03] [int] NULL,
    [SleepHome04] [int] NULL,
    [SleepHome05] [int] NULL,
    [SleepHome06] [int] NULL,
    [SleepHome07] [int] NULL,
    [SleepHome08] [int] NULL,
    [SleepHome09] [int] NULL,
    [SleepHome10] [int] NULL,
    [SleepHome11] [int] NULL,
    [SleepHome12] [int] NULL,
    [SleepHome13] [int] NULL,
    [SleepHome14] [int] NULL,
    [SleepHome15] [int] NULL,
    [DateOfBirth01] [date] NULL,
    [DateOfBirth02] [date] NULL,
    [DateOfBirth03] [date] NULL,
    [DateOfBirth04] [date] NULL,
    [DateOfBirth05] [date] NULL,
    [DateOfBirth06] [date] NULL,
    [DateOfBirth07] [date] NULL,
    [DateOfBirth08] [date] NULL,
    [DateOfBirth09] [date] NULL,
    [DateOfBirth10] [date] NULL,
    [DateOfBirth11] [date] NULL,
    [DateOfBirth12] [date] NULL,
    [DateOfBirth13] [date] NULL,
    [DateOfBirth14] [date] NULL,
    [DateOfBirth15] [date] NULL,
    [License01] [int] NULL,
    [License02] [int] NULL,
    [License03] [int] NULL,
    [License04] [int] NULL,
    [License05] [int] NULL,
    [License06] [int] NULL,
    [License07] [int] NULL,
    [License08] [int] NULL,
    [License09] [int] NULL,
    [License10] [int] NULL,
    [License11] [int] NULL,
    [License12] [int] NULL,
    [License13] [int] NULL,
    [License14] [int] NULL,
    [License15] [int] NULL,
    [MainTransportMode01] [int] NULL,
    [MainTransportMode02] [int] NULL,
    [MainTransportMode03] [int] NULL,
    [MainTransportMode04] [int] NULL,
    [MainTransportMode05] [int] NULL,
    [MainTransportMode06] [int] NULL,
    [MainTransportMode07] [int] NULL,
    [MainTransportMode08] [int] NULL,
    [MainTransportMode09] [int] NULL,
    [MainTransportMode10] [int] NULL,
    [MainTransportMode11] [int] NULL,
    [MainTransportMode12] [int] NULL,
    [MainTransportMode13] [int] NULL,
    [MainTransportMode14] [int] NULL,
    [MainTransportMode15] [int] NULL

1 个答案:

答案 0 :(得分:0)

这实际上不会创建表,但它会为您提供数据:我修复了原始代码(PersonID,而不是PesonID)中的一些拼写错误,但是否则它们是相同的。

请注意,由于您没有提供任何样本数据而且我不打算尝试加载所有数据,我无法针对任何内容进行测试 - 请查看其准确性并告诉我是否存在有任何问题。如果您不需要临时表,请将其注释掉,并用实际表替换对它的引用。

--DROP TABLE #FamiliesStageA 

CREATE TABLE #FamiliesStageA(
    [Hhid] [int] NOT NULL,
    [AssignedUser] [int] NULL,
    [Hhphone] [nvarchar](11) NULL,
    [FamilyName] [nvarchar](50) NULL,
    [City] [int] NULL,
    [Street] [int] NULL,
    [HouseNum] [int] NULL,
    [Hhsize] [int] NULL,
    [NumCar] [int] NULL,
    [CarYear] [int] NULL,
    [CarMake01] [int] NULL,
    [CarMake02] [int] NULL,
    [CarMake03] [int] NULL,
    [CarMake04] [int] NULL,
    [CarMake05] [int] NULL,
    [CarModel01] [int] NULL,
    [CarModel02] [int] NULL,
    [CarModel03] [int] NULL,
    [CarModel04] [int] NULL,
    [CarModel05] [int] NULL,
    [PersonID01] [int] NULL,
    [PersonID02] [int] NULL,
    [PersonID03] [int] NULL,
    [PersonID04] [int] NULL,
    [PersonID05] [int] NULL,
    [PersonID06] [int] NULL,
    [PersonID07] [int] NULL,
    [PersonID08] [int] NULL,
    [PersonID09] [int] NULL,
    [PersonID10] [int] NULL,
    [PersonID11] [int] NULL,
    [PersonID12] [int] NULL,
    [PersonID13] [int] NULL,
    [PersonID14] [int] NULL,
    [PersonID15] [int] NULL,
    [Phone01] [int] NULL,
    [Phone02] [int] NULL,
    [Phone03] [int] NULL,
    [Phone04] [int] NULL,
    [Phone05] [int] NULL,
    [Phone06] [int] NULL,
    [Phone07] [int] NULL,
    [Phone08] [int] NULL,
    [Phone09] [int] NULL,
    [Phone10] [int] NULL,
    [Phone11] [int] NULL,
    [Phone12] [int] NULL,
    [Phone13] [int] NULL,
    [Phone14] [int] NULL,
    [Phone15] [int] NULL,
    [FirstName01] [int] NULL,
    [FirstName02] [int] NULL,
    [FirstName03] [int] NULL,
    [FirstName04] [int] NULL,
    [FirstName05] [int] NULL,
    [FirstName06] [int] NULL,
    [FirstName07] [int] NULL,
    [FirstName08] [int] NULL,
    [FirstName09] [int] NULL,
    [FirstName10] [int] NULL,
    [FirstName11] [int] NULL,
    [FirstName12] [int] NULL,
    [FirstName13] [int] NULL,
    [FirstName14] [int] NULL,
    [FirstName15] [int] NULL,
    [SleepHome01] [int] NULL,
    [SleepHome02] [int] NULL,
    [SleepHome03] [int] NULL,
    [SleepHome04] [int] NULL,
    [SleepHome05] [int] NULL,
    [SleepHome06] [int] NULL,
    [SleepHome07] [int] NULL,
    [SleepHome08] [int] NULL,
    [SleepHome09] [int] NULL,
    [SleepHome10] [int] NULL,
    [SleepHome11] [int] NULL,
    [SleepHome12] [int] NULL,
    [SleepHome13] [int] NULL,
    [SleepHome14] [int] NULL,
    [SleepHome15] [int] NULL,
    [DateOfBirth01] [date] NULL,
    [DateOfBirth02] [date] NULL,
    [DateOfBirth03] [date] NULL,
    [DateOfBirth04] [date] NULL,
    [DateOfBirth05] [date] NULL,
    [DateOfBirth06] [date] NULL,
    [DateOfBirth07] [date] NULL,
    [DateOfBirth08] [date] NULL,
    [DateOfBirth09] [date] NULL,
    [DateOfBirth10] [date] NULL,
    [DateOfBirth11] [date] NULL,
    [DateOfBirth12] [date] NULL,
    [DateOfBirth13] [date] NULL,
    [DateOfBirth14] [date] NULL,
    [DateOfBirth15] [date] NULL,
    [License01] [int] NULL,
    [License02] [int] NULL,
    [License03] [int] NULL,
    [License04] [int] NULL,
    [License05] [int] NULL,
    [License06] [int] NULL,
    [License07] [int] NULL,
    [License08] [int] NULL,
    [License09] [int] NULL,
    [License10] [int] NULL,
    [License11] [int] NULL,
    [License12] [int] NULL,
    [License13] [int] NULL,
    [License14] [int] NULL,
    [License15] [int] NULL,
    [MainTransportMode01] [int] NULL,
    [MainTransportMode02] [int] NULL,
    [MainTransportMode03] [int] NULL,
    [MainTransportMode04] [int] NULL,
    [MainTransportMode05] [int] NULL,
    [MainTransportMode06] [int] NULL,
    [MainTransportMode07] [int] NULL,
    [MainTransportMode08] [int] NULL,
    [MainTransportMode09] [int] NULL,
    [MainTransportMode10] [int] NULL,
    [MainTransportMode11] [int] NULL,
    [MainTransportMode12] [int] NULL,
    [MainTransportMode13] [int] NULL,
    [MainTransportMode14] [int] NULL,
    [MainTransportMode15] [int] NULL)


SELECT 
    Family.HHID,
    AssignedUser,
    HHPhone,
    FamilyName,
    City,
    Street,
    HouseNum,
    HHSize,
    NumCar,
    CarYear,
    CarMake.CarMake,
    CarModel.CarModel,
    PersonID.PersonID,
    Phone.Phone,
    FirstName.FirstName,
    SleepHome.SleepHome,
    DateOfBirth.DateOfBirth,
    License.License,
    MainTransportMode.MainTransportMode
FROM 
    #FamiliesStageA Family
     INNER JOIN 
      (
        SELECT 1 AS Number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION 
        SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION 
        SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15  
      ) Nums ON 1=1
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            CarMake
        FROM #FamiliesStageA
        UNPIVOT
            (CarMake FOR COL IN 
              ([CarMake01], [CarMake02], [CarMake03], [CarMake04], [CarMake05])
              ) UP
      ) CarMake ON 
        Family.HHID = CarMake.Hhid AND
        Nums.Number = CarMake.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            CarModel
        FROM #FamiliesStageA
        UNPIVOT
            (CarModel FOR COL IN 
              (
              [CarModel01], [CarModel02], [CarModel03], [CarModel04], [CarModel05])
              ) UP
      ) CarModel ON 
        Family.HHID = CarModel.Hhid AND
        Nums.Number = CarModel.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            PersonID
        FROM #FamiliesStageA
        UNPIVOT
            (PersonID FOR COL IN 
              (
              [PersonID01], [PersonID02], [PersonID03], [PersonID04], [PersonID05],
              [PersonID06], [PersonID07], [PersonID08], [PersonID09], [PersonID10],
              [PersonID11], [PersonID12], [PersonID13], [PersonID14], [PersonID15])
              ) UP
      ) PersonID ON 
        Family.HHID = PersonID.Hhid AND
        Nums.Number = PersonID.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            Phone
        FROM #FamiliesStageA
        UNPIVOT
            (Phone FOR COL IN 
              (
              [Phone01], [Phone02], [Phone03], [Phone04], [Phone05],
              [Phone06], [Phone07], [Phone08], [Phone09], [Phone10],
              [Phone11], [Phone12], [Phone13], [Phone14], [Phone15])
              ) UP
      ) Phone ON 
        Family.HHID = Phone.Hhid AND
        Nums.Number = Phone.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            FirstName
        FROM #FamiliesStageA
        UNPIVOT
            (FirstName FOR COL IN 
              (
              [FirstName01], [FirstName02], [FirstName03], [FirstName04], [FirstName05],
              [FirstName06], [FirstName07], [FirstName08], [FirstName09], [FirstName10],
              [FirstName11], [FirstName12], [FirstName13], [FirstName14], [FirstName15])
              ) UP
      ) FirstName ON 
        Family.HHID = FirstName.Hhid AND
        Nums.Number = FirstName.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            SleepHome
        FROM #FamiliesStageA
        UNPIVOT
            (SleepHome FOR COL IN 
              (
              [SleepHome01], [SleepHome02], [SleepHome03], [SleepHome04], [SleepHome05],
              [SleepHome06], [SleepHome07], [SleepHome08], [SleepHome09], [SleepHome10],
              [SleepHome11], [SleepHome12], [SleepHome13], [SleepHome14], [SleepHome15])
              ) UP
      ) SleepHome ON 
        Family.HHID = SleepHome.Hhid AND
        Nums.Number = SleepHome.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            DateOfBirth
        FROM #FamiliesStageA
        UNPIVOT
            (DateOfBirth FOR COL IN 
              (
              [DateOfBirth01], [DateOfBirth02], [DateOfBirth03], [DateOfBirth04], [DateOfBirth05],
              [DateOfBirth06], [DateOfBirth07], [DateOfBirth08], [DateOfBirth09], [DateOfBirth10],
              [DateOfBirth11], [DateOfBirth12], [DateOfBirth13], [DateOfBirth14], [DateOfBirth15])
              ) UP
      ) DateOfBirth ON 
        Family.HHID = DateOfBirth.Hhid AND
        Nums.Number = DateOfBirth.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            License
        FROM #FamiliesStageA
        UNPIVOT
            (License FOR COL IN 
              (
              [License01], [License02], [License03], [License04], [License05],
              [License06], [License07], [License08], [License09], [License10],
              [License11], [License12], [License13], [License14], [License15])
              ) UP
      ) License ON 
        Family.HHID = License.Hhid AND
        Nums.Number = License.PersonNum
     LEFT JOIN 
      (
        SELECT 
            HHID,
            RIGHT(UP.COL,2) AS PersonNum,
            MainTransportMode
        FROM #FamiliesStageA
        UNPIVOT
            (MainTransportMode FOR COL IN 
              (
              [MainTransportMode01], [MainTransportMode02], [MainTransportMode03], [MainTransportMode04], [MainTransportMode05],
              [MainTransportMode06], [MainTransportMode07], [MainTransportMode08], [MainTransportMode09], [MainTransportMode10],
              [MainTransportMode11], [MainTransportMode12], [MainTransportMode13], [MainTransportMode14], [MainTransportMode15])
      ) UP
      ) MainTransportMode ON 
        Family.HHID = MainTransportMode.Hhid AND
        Nums.Number = MainTransportMode.PersonNum