【问题标题】:Pivot in Pivot Columns in SQL QuerySQL 查询中的透视列中的透视
【发布时间】:2017-03-22 02:53:29
【问题描述】:

我是 SQL 的新手,正在学习写作 Quires。帮我。提前致谢。

实际上,我通过使用query 得到以下结果表

select * from 
(select case Temp 
           when '0' then 'Temperature' 
           when '1' then 'PULSE RATE/MIN'
           when '2' then 'RESPIRATION/MIN' 
           when '3' then 'BLOOD PRESSURE' 
           when '4' then 'URINE' 
        end as Temp,
        Value, 
        convert(nvarchar(15),Date,103) Date,
       concat(case Time 
                 when '0' then '2' 
                 when '1' then '6' 
                 when '2' then '10' 
              end,' ',
              case AMPM 
                 when '0' then 'AM' 
                 when '1' then 'PM' 
              end)[Tim]
from HMS_Chart_Clinical
where status = '0' and IPNO='21460') as s
pivot(max(Value) for [date] in ([07/11/2016],[08/11/2016])) as datapivot
pivot(max(Tim) for [Tim] in ([2 AM],[6 AM],[10 AM],[2 PM],[6 PM],[10 PM])) as datapivot

但我需要下面的结果表。

【问题讨论】:

  • 一个带有数据的 SQLfiddle 适合这类问题。
  • 那个确切的表在 sqlserver 中不能存在,因为它不是一个表。

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


【解决方案1】:

我有与问题无关的问题。所以在不影响你原有思维方式的前提下:

DECLARE @HMS_Chart_Clinical TABLE (
 [ID]     INT PRIMARY KEY NOT NULL IDENTITY (1,1),
 [Temp]   INT, --0,1,2,3,4
 [Value]  INT,
 [Date]   DATE,
 [Time]   INT,   -- 0,1,2
 [AMPM]   INT,   -- 0,1
 [status] BIT,
 [IPNO]   INT
)

INSERT @HMS_Chart_Clinical ([Temp], [Value], [Date], [Time], [AMPM], [status], [IPNO]) VALUES (3, 125, '20161107', 2, 0, 0, 21460)
INSERT @HMS_Chart_Clinical ([Temp], [Value], [Date], [Time], [AMPM], [status], [IPNO]) VALUES (1, 26, '20161108', 2, 1, 0, 21460)
INSERT @HMS_Chart_Clinical ([Temp], [Value], [Date], [Time], [AMPM], [status], [IPNO]) VALUES (1, 99, '20161107', 1, 1, 0, 21460)
INSERT @HMS_Chart_Clinical ([Temp], [Value], [Date], [Time], [AMPM], [status], [IPNO]) VALUES (0, 106, '20161107', 0, 0, 0, 21460)

IF OBJECT_ID('tempdb..#PivotSource') IS NOT NULL
    DROP TABLE #PivotSource

  CREATE TABLE #PivotSource
  (
   Temp       VARCHAR(MAX),
   Value      INT,
   [DateTime] VARCHAR(MAX)
  )
  INSERT INTO #PivotSource
  SELECT CASE Temp 
           WHEN '0' THEN 'Temperature' 
           WHEN '1' THEN 'PULSE RATE/MIN'
           WHEN '2' THEN 'RESPIRATION/MIN' 
           WHEN '3' THEN 'BLOOD PRESSURE' 
           WHEN '4' THEN 'URINE' 
         END AS Temp,
         Value, 
         CONVERT(NVARCHAR(15),[Date],103) + ' ' + 
         CASE [Time] 
           WHEN '0' THEN '2' 
           WHEN '1' THEN '6' 
           WHEN '2' THEN '10' 
         END + ' ' + 
         CASE AMPM 
            WHEN '0' THEN 'AM' 
            WHEN '1' THEN 'PM' 
         END AS [DateTime]
    FROM @HMS_Chart_Clinical
   WHERE [status] = '0' 
     AND IPNO='21460' 

DECLARE @PivotColumns NVARCHAR(MAX)

;WITH AllDatesAndTimes AS (
    SELECT DISTINCT [Date], 
           TimeString.[Time],
           TimeString.[SortOrder]
      FROM @HMS_Chart_Clinical
CROSS JOIN (SELECT '2 AM'  AS [Time], 0 AS SortOrder
  UNION ALL SELECT '6 AM'  AS [Time], 1 AS SortOrder
  UNION ALL SELECT '10 AM' AS [Time], 2 AS SortOrder
  UNION ALL SELECT '2 PM'  AS [Time], 3 AS SortOrder
  UNION ALL SELECT '6 PM'  AS [Time], 4 AS SortOrder
  UNION ALL SELECT '10 PM' AS [Time], 5 AS SortOrder) TimeString
)  
SELECT @PivotColumns = COALESCE(@PivotColumns + '], [', '') + CONVERT(NVARCHAR(15),[Date],103) + ' ' + [Time]
FROM AllDatesAndTimes
ORDER BY [Date],[SortOrder]

DECLARE @PivotQuery NVARCHAR(MAX) =  'SELECT * FROM #PivotSource  PIVOT(MAX(Value) FOR [DateTime] IN ([' + @PivotColumns + '])) AS DATAPIVOT'
EXEC(@PivotQuery)

【讨论】:

    【解决方案2】:

    你不能有那张桌子。您可以做的最好的事情是创建这些列并在 UI 中添加额外的标题。

     07/11/2016 02:00 am
     07/11/2016 06:00 am
     07/11/2016 10:00 am
     07/11/2016 02:00 pm
     07/11/2016 06:00 pm
     07/11/2016 10:00 pm
     08/11/2016 02:00 am
     08/11/2016 06:00 am
     08/11/2016 10:00 am
     08/11/2016 02:00 pm
     08/11/2016 06:00 pm
     08/11/2016 10:00 pm
    

    所以将您的查询更改为

    concat(convert(nvarchar(15),Date,103) Date,
           case Time 
                 when '0' then '2' 
                 when '1' then '6' 
                 when '2' then '10' 
           end,' ',
           case AMPM 
                 when '0' then 'AM' 
                 when '1' then 'PM' 
           end) as [Tim]
    

    并使用单个枢轴

    pivot(max(Tim) for [Tim] in ([07/11/2016 02 AM],
                                 [07/11/2016 06 AM],
                                 [07/11/2016 10 AM],
                                 [07/11/2016 02 PM],
                                 [07/11/2016 06 PM],
                                 [07/11/2016 10 PM]) .....) as datapivot
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2021-06-29
      • 2017-02-22
      相关资源
      最近更新 更多