【问题标题】:Retrieve multiple rows into single row based on FK SQL Server 2014基于 FK SQL Server 2014 将多行检索为单行
【发布时间】:2021-05-24 09:11:05
【问题描述】:

我有下表:

ID_TableDetails FK_TableMaster StartDate EndDate StartTime EndTime
1 1 2021-05-24 2021-05-24 10:00 11:00
2 1 2021-05-25 2021-05-25 10:00 11:00
3 1 2021-05-26 2021-05-26 11:00 12:00
4 2 2021-05-27 2021-05-27 11:00 12:00
5 2 2021-05-28 2021-05-28 11:00 12:00
6 2 2021-05-29 2021-05-29 11:00 12:00

我想通过以下方式从上表中选择值

1stID 2ndID 3rdID 1stStartDte 1stStartTimeEndTime 2ndStartDte 2ndStartTimeEndTime 3rdStartDte 3rdStartTimeEndTime
1 2 3 2021-05-24 10:00 TO 11:00 2021-05-25 10:00 TO 11:00 2021-05-26 11:00 TO 12:00
4 5 6 2021-05-24 10:00 TO 11:00 2021-05-25 10:00 TO 11:00 2021-05-26 11:00 TO 12:00

FK_TableMaster 总是有三个条目,我想选择一行。

这是我尝试过的

SELECT 
    ID_TableDetils, Description, Startate, EndDate, StartTime, EndTime  
FROM 
    TableDetils AS TD
JOIN 
    TableMaster AS TM ON TD.ID_TableDetils = TM.FK_TableMaster

这将为 FK_TableMaster 返回多行 - 我不知道如何将其作为单行选择,任何帮助将不胜感激。

更新基于:Group by column and multiple Rows into One Row multiple columns

WITH RNs AS
(
   SELECT ID_TableDetails,
          FK_TableMaster,
          StartDate,
          EndDate,
          ROW_NUMBER() OVER (PARTITION BY ID_PtaEventScheduleDetails, FK_PtaEventSchedule ORDER BY (SELECT NULL)) AS RN --ORDER BY should be your ID/always ascending column
   FROM dbo.TableDetails 
   WHERE Cancelled = 0 AND FK_TableMaster = 1
)
SELECT 
    ID_TableDetails,
    FK_TableMaster,
    MAX(CASE RN WHEN 1 THEN StartDate END) AS Result1,
    MAX(CASE RN WHEN 2 THEN StartDate END) AS Result2,
    MAX(CASE RN WHEN 3 THEN StartDate END) AS Result3,
    MAX(CASE RN WHEN 1 THEN EndDate END) AS Result4,
    MAX(CASE RN WHEN 1 THEN EndDate END) AS Result5,
    MAX(CASE RN WHEN 1 THEN EndDate END) AS Result6
FROM 
    RNs R
GROUP BY 
    ID_TableDetails, FK_TableMaster

【问题讨论】:

  • @Larnu 不,这种方法不符合我的要求
  • 为什么不呢?我建议这样做。您想以行号为中心;这就是你想要在这里做的。 Edit你的问题来解释为什么受骗候选人不回答问题。
  • @Larnu 在分组时仍然为 Fk 返回多行
  • 您希望每个值 FK_TableMaster not 每个值 1 行每个 FK_TableMasterID_TableDetailsID_TableDetails 不应出现在您的 GROUP BY/PARTITION BY 中。

标签: sql-server date datetime


【解决方案1】:

与提议的欺骗候选人Group by column and multiple Rows into One Row multiple columns 重复,但要再次发布相同的答案,将我的其他答案中的列替换为 OP:

WITH RNs AS(
    SELECT ID_TableDetails,
           FK_TableMaster,
           StartDate,
           EndDate,
           StartTime,
           EndTime,
           ROW_NUMBER() OVER (PARTITION BY FK_TableMaster ORDER BY ID_TableDetails) AS RN 
    FROM dbo.Result)
SELECT MAX(CASE RN WHEN 1 THEN ID_TableDetails END) AS ID1,
       MAX(CASE RN WHEN 2 THEN ID_TableDetails END) AS ID2,
       MAX(CASE RN WHEN 3 THEN ID_TableDetails END) AS ID3,
       MAX(CASE RN WHEN 1 THEN StartDate END) AS StartDate1,
       MAX(CASE RN WHEN 1 THEN StartTime END) AS StartTime1,
       MAX(CASE RN WHEN 1 THEN EndTime END) AS EndTime1,
       ... --You get the idea
       MAX(CASE RN WHEN 3 THEN EndTime END) AS EndTime3
FROM RNs R
GROUP BY FK_TableMaster;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2018-03-02
    • 2021-01-30
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多