【问题标题】:How to pivot temp table in sql如何在sql中透视临时表
【发布时间】:2017-02-27 12:59:40
【问题描述】:
      Date             Time        Mode ID
    2017-01-01  13:00:00.0000000    3   10
    2017-01-01  14:00:00.0000000    1   10
    2017-01-01  15:00:00.0000000    3   10
    2017-01-01  15:30:00.0000000    1   10

这是一个临时表。我只想将时间列显示为 2 列,1 列模式 =3,其他列模式 =1。

这是一个临时表。我只想要下面的输出:

          Date         InTime(Mode-3)    OutTime(Mode-1)     ID

         2017-01-01   13:00:00.0000000  14:00:00.0000000    10

         2017-01-01   15:00:00.0000000  15:30:00.0000000    10

【问题讨论】:

标签: sql sql-server sql-server-2008 pivot-table


【解决方案1】:

猜测您想要一种方法来创建具有固定值(1 和 3)的交替行。 你可以使用

ROW_NUMBER() 结束时的情况(按 [Date] 排序)%2 = 0 then 1 else 3

作为模式列的逻辑

【讨论】:

  • 这是一个临时表。我只想将时间列显示为 2 列,1 列模式 = 3,其他列模式 = 1
【解决方案2】:

试试这个,

DECLARE @TB TABLE (DATETIME VARCHAR(30),ID INT)
INSERT INTO @TB VALUES
('2017-01-01 13:00:00.0000000',10),
('2017-01-01 14:00:00.0000000',10),
('2017-01-01 15:00:00.0000000',10),
('2017-01-01 15:30:00.0000000',10 )

SELECT  SUBSTRING(DATETIME,0,11) DATE
        ,SUBSTRING(DATETIME,12,LEN(DATETIME)) TIME
        ,CASE WHEN ROW_NUMBER() OVER (ORDER BY DATETIME)%2 = 0 THEN 1 ELSE 3 END MODE
        ,ID
FROM    @TB

【讨论】:

    【解决方案3】:

    这取决于数据和数据类型/模式(如果表的名称是 timeTable):

        SELECT DATE, time AS 'InTime(Mode-3)',
          (SELECT TOP 1 time FROM timeTable
              WHERE mode = 1 
                AND id = outerTable.id 
                AND date = outerTable.date 
                AND time > outerTable.time 
              ORDER BY date, time) AS 'OutTime(Mode-1)',
          ID
        FROM timeTable AS outerTable 
        WHERE mode = 3
    
    • outerQuery 只选择in-times mode = 3
    • innerQuery 选择下一个out-time,对应于选择的in-time,并且只返回第一个。由于按日期和时间排序,它应该是下一个。 仅使用您给定的数据进行测试

    输出:

        Date       |  InTime(Mode-3)     |   OutTime(Mode-1)   |  ID
    ---------------|---------------------|---------------------|------
       2017-01-01  |  13:00:00.0000000   |  14:00:00.0000000   |  10
       2017-01-01  |  15:00:00.0000000   |  15:30:00.0000000   |  10
    

    仅供参考:
    我使用了这个表模式

     CREATE TABLE timeTable(
         date DATE,
         time TIME,
         mode INTEGER,
         id INTEGER
     );
    

    更新:
    有时差:

    SELECT *, DATEDIFF(MINUTE,INTIME,OUTTIME) AS [DIFFERENCE] FROM (
        SELECT [DATE], [time] AS INTIME,
          (SELECT TOP 1 [time] FROM timeTable
              WHERE [mode] = 1 
                AND [id] = outerTable.id 
                AND [date] = outerTable.date 
                AND [time] > outerTable.time 
              ORDER BY [date], [time]) AS OUTTIME,
          [ID]
        FROM [timeTable] AS outerTable 
        WHERE [mode] = 3
    ) WholeData
    

    【讨论】:

    • 还需要获取另一列-winner_joiner的时差
    • @michael DATEDIFF(MINUTE, column1, column2) 这行得通
    • 我试过了,但我实际上将它插入到 #temp 表中 SELECT DATE, time AS 'InTime(Mode-3)', (SELECT TOP 1 time FROM #timeTable WHERE mode = 1 AND id = outerTable.id AND date = outerTable.date AND time > outerTable.time ORDER BY date, time) AS 'OutTime(Mode-1)', ID,DATEDIFF(mi,MIN(Time),MAX(Time) as BreakHours into #temp FROM #timeTable AS outerTable WHERE mode = 3 @winner_joiner
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多