当前位置: 首页 > 面试题库 >

具有独立where子句的多列-SQL Pivot?

阴高刚
2023-03-14
问题内容

是否可以采用以下方式构成的表:

ID    Month     Info1 Info2
1      1          A     B
1      2          C     D
1      3          E     F
2      3          G     H
2      4          I     J

最终变成这样的表:

ID    JanInfo1 JanInfo2 FebInfo1 FebInfo2 MarInfo1 MarInfo2 AprInfo1 AprInfo2
1        A        B        C        D        E        F        NULL    NULL
2       NULL      NULL    NULL     NULL      G        H         I       J

我已经研究过使用枢轴,但无法使其正常工作。

我目前每个月都使用CROSS APPLY表值函数。

有一个更好的方法吗?

编辑:添加了现有查询-试图简化显示:

-- Get the unique IDs
DECLARE @PersonIds TABLE
(
    UploadID UNIQUEIDENTIFIER,
    PersonId VARCHAR(200),
    RecordYear INT
)
INSERT INTO @PersonIds
    SELECT DISTINCT UploadID, PersonId, RecordYear
    FROM [VERTICALTABLE] 
    WHERE UploadID = @PTPUploadID
            AND RecordYear = @RecordYear
        GROUP BY  UploadID, PersonId, RecordYear

-- Flatten via functions
INSERT INTO [FLATTABLE](PersonID, JanuaryCoverage, FebruaryCoverage, MarchCoverage, AprilCoverage, MayCoverage, JuneCoverage, 
        JulyCoverage, AugustCoverage, SeptemberCoverage, OctoberCoverage, NovemberCoverage, DecemberCoverage)

    SELECT PID.PersonID, M1.Covered, M2.Covered, M3.Covered, M4.Covered, M5.Covered, M6.Covered,
        M7.Covered, M8.Covered, M9.Covered, M10.Covered, M11.Covered, M12.Covered
    FROM @PersonIds AS PID
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 1, PID.PersonId) AS M1
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 2, PID.PersonId) AS M2
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 3, PID.PersonId) AS M3
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 4, PID.PersonId) AS M4
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 5, PID.PersonId) AS M5
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 6, PID.PersonId) AS M6
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 7, PID.PersonId) AS M7
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 8, PID.PersonId) AS M8
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 9, PID.PersonId) AS M9
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 10, PID.PersonId) AS M10
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 11, PID.PersonId) AS M11
    OUTER APPLY GetMonthInfpo(@PTPUploadID, @RecordYear, 12, PID.PersonId) AS M12
    WHERE UploadID = @PTPUploadID 
        AND RecordYear = @RecordYear

功能看起来像

ALTER FUNCTION GetMonthInfpo( 
(   
    @UploadID UNIQUEIDENTIFIER,
    @Year INT,
    @Month INT,
    @PersonID VARCHAR(200)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT COUNT(*) AS 'Covered'
    FROM [VERTICALTABLE] 
    WHERE UploadID = @UploadID
        AND RecordYear = @Year
        AND RecordMonth = @Month
        AND PersonId = @PersonID
)

问题答案:

您不需要多个子查询。答案很容易-使用集合理论。从您的第一个表ID / Month / Info1 / Info2轻松合并即可完成ID / Month +(1
+ 2)/ Info-例如:

select ID, cast(Month as varchar(10)) + cast('_1' as varchar(10)) ComposedMonth, Info1 Info 
from tbl
union all
select ID, cast(Month as varchar(10)) + cast('_2' as varchar(10)), Info2 
from tbl

然后在此数据集上使用(表示为视图或临时表)pivot子句。

select * 
from vw_tbl t
pivot (max(Info) for ComposedMonth in ([1_1], [1_2]...)) p
-- or if you will cast month to text
-- pivot (max(Info) for ComposedMonth in ([Jan_1], [Jan_2]...)) p

组成字符串是轻松旋转的关键。



 类似资料:
  • 问题内容: 我有一个查询说 ,我想要的是使用where子句或其他任何方式显示多个记录,以便获得以下数据。 姓名编号 我试着用 在clause.ie 或等,但没有作品。 问题答案: 只需使用一个子句 您也可以使用OR(仅用于提供信息,在这种情况下,我将不使用此功能) 如果您的where子句中有其他条件,请不要忘记在“或”周围加上圆括号。

  • 问题内容: 对于MYSQL,我正在使用以下查询: 没关系,但我想向其投放15个以上的广告: 我要如何添加呢? 编辑: 根据猎人的建议: 这很棒!谢谢 问题答案: 这样的事情应该为您工作: 另外,如Simon所建议的,您可以这样做来避免输入两次值: 资料来源:http : //www.karlrixon.co.uk/writing/update-multiple-rows-with-differen

  • 我是QueryDSL的新手,能够在WHERE-in子句中组装具有多个列的查询,如下所示: 我有主要查询的部分: 但我不知道如何实现where子句。如何在QueryDSL中实现这一点? 提前致谢!

  • 问题内容: 我一直在为整个查询尝试正式向我做噩梦的查询。该系统是用户和联系人管理。所以我有,和。 与手机具有双向一对多关系,并且在电话上具有单向关系,所有关系均由映射: 现在,“联系人”具有一对多电话通话 我正在编写一种方法,通过电子邮件唯一字段来检查特定用户的同一联系人是否存在相同号码。 我知道我可以为此而覆盖and ,但是由于电话是按set映射的实体,因此我现在不知道该怎么做。因此,我想提供一

  • 问题内容: 我目前有一个查询,它将根据我想使用的任何条件从数据库中提取一堆信息。 如果参数=’‘,我希望能够删除注释部分并仅显示所有行 例如,如果我使用它,它将按该参数搜索,如果我使用它,将按该参数搜索。 我已经尝试使用以下方法和其他一些尝试,但是进展并不很快。 问题答案: 您可能需要考虑构建查询。

  • 问题内容: 案件: 如何从相等的地方更新数据? 问题: 当我运行以下更新语句时,它将更新中的所有记录(即使中的字段不存在)。 我如何使用的多个更新表的语法,在仅更新记录只有在存在于和平等的吗? 提前致谢。 问题答案: 这是with join in 的正确语法 SQLFiddle演示