簡體   English   中英

SQL將一張表的多行合並為多列的一行

[英]SQL Combine multiple rows from one table into one row with multiple columns

如果我有日期和時間與以下相同或不同的數據:

ID    Date               LOC
1     2015-12-02 10:05   A
1     2015-12-02 10:05   B2
2     2015-12-02 10:05   D
2     2015-12-02 10:05   A7P 
2     2015-12-02 10:06   AD

有什么方法可以顯示以下內容:

ID   DATE1             LOC1  DATE 2            LOC2  DATE 3            LOC3
1    2015-12-02 10:05  A     2015-12-02 10:05  B2
2    2015-12-02 10:05  D     2015-12-02 10:05  A7P   
2    2015-12-02 10:06  AD

因此,會有多行ID相同但日期和時間不同的行?

我使用了下面的分區示例,它非常適合按照我最初的要求將數據放入一行。 但是,當ID相同但日期和時間不同時,可以顯示多行。

下面是已答復的原始問題。

我已經瀏覽了與該問題有關的所有答案,但找不到任何有效的代碼,很多問題與兩個表有關。

我有一張表,其中包含多行數據,多列包含不同的數據類型,例如

ID    Date               LOC
1     2015-11-05 10:05   A
1     2015-12-02 10:06   B2
2     2015-12-02 10:05   D
2     2015-12-02 10:05   A7P 
2     2015-12-02 10:06   AD

我只需要為每個ID分配一行,並將所有數據分成多列

ID   DATE1             LOC1  DATE 2            LOC2  DATE 3            LOC3
1    2015-11-05 10:05  A     2015-12-02 10:06  B2
2    2015-12-02 10:05  D     2015-12-02 10:05  A7P   2015-12-02 10:06  AD

這些文件可能具有重復的數據,並且同一ID可能包含一行或多行。

我試過一些樞軸/取消樞軸的sql代碼,但是在取消樞紐中遇到不同類型的錯誤。

任何幫助將不勝感激。

這是基本的方法,首先創建row_number然后進行連接

WITH TAB_RN AS
(
  SELECT ID, Date, LOC, ROW_NUMBER() OVER (PARTITION BY ID, Date ORDER BY LOC) AS RN
  FROM YOUR_TABLE
)
SELECT T1.ID, 
       T1.Date AS DATE1, T1.LOC AS LOC1,
       T2.Date AS DATE2, T2.LOC AS LOC2,
       T3.Date AS DATE3, T3.LOC AS LOC3
FROM TAB_RN T1
LEFT JOIN TAB_RN T2 ON T1.ID = T2.ID AND T1.Date = T2.Date AND T2.RN = 2
LEFT JOIN TAB_RN T3 ON T1.ID = T3.ID AND T1.Date = T2.Date AND T3.RN = 3
WHERE T1.RN = 1

如果您不知道“多少”,那么您必須使用它作為模板來制作動態sql。

我想我已經設法做到了,但是我不確定這是否有錯誤。

我創建了一個樣本表用於測試

CREATE TABLE Trace (
    TraceID INT IDENTITY(1,1)
    , ID INT
    , [Date] DATETIME
    , LOC NVARCHAR(50)
)

INSERT INTO Trace (ID, [Date], LOC)
VALUES
(1,'2015-12-02 10:05','A'),
(1,'2015-12-02 10:05','B2'),
(2,'2015-12-02 10:05','D'),
(2,'2015-12-02 10:05','A7P'),
(2,'2015-12-02 10:06','AD')

並且如果您希望基於每個ID的最大位置計數(柔性列)獲取記錄,則可以嘗試以下腳本。

   -- build up table to keep the values in 1 column and make a flag (StatusCode) out of it
        SELECT 
            ROW_NUMBER() OVER (PARTITION BY ID, StatusCode ORDER BY TraceID, Pos) AS idx
            , *
        INTO #resultBuildUp 
        FROM (
                SELECT
                    TraceID
                    , 2 AS [Pos]
                    , [ID]
                    , 'LOC' + CONVERT(NVARCHAR(50),(ROW_NUMBER() OVER (PARTITION BY ID, [Date] ORDER BY TraceID))) AS StatusCode
                    , LOC AS [val]
                FROM Trace
            UNION ALL
                SELECT
                    TraceID
                    , 1 AS [Pos]
                    , [ID]
                    , 'DATE ' + CONVERT(NVARCHAR(50),(ROW_NUMBER() OVER (PARTITION BY ID, [Date] ORDER BY TraceID))) AS StatusCode
                    , REPLACE(CONVERT(NVARCHAR(50),[Date],111),'/','-') + ' ' + CONVERT(NVARCHAR(50),[Date],108) AS [val]
                FROM Trace
        ) AS T

    --this is a builder to create the "select" columns for PIVOT

        SELECT
            StatusCode
        INTO #tmpDistinctColumns
        FROM #resultBuildUp
        GROUP BY
            StatusCode
        ORDER BY 
            min(TraceID)
            , min(Pos)

        DECLARE @distinct NVARCHAR(MAX) = ''

        SET @distinct = (SELECT '[' + StatusCode + '],' AS [text()] FROM #tmpDistinctColumns FOR XML PATH(''))
        SET @distinct = SUBSTRING(@distinct, 0, LEN(@distinct))

-- and lastly, the pivot query wherein I hid the position modifier(idx) for the query

EXEC ('
SELECT
    ID
    , ' + @distinct + '
FROM (
    SELECT
        idx,
        ID,
        StatusCode,
        val
    FROM #resultBuildUp
) AS s 
PIVOT
(
    MAX(Val)
    FOR StatusCode IN (' + @distinct + ')
) AS pvt
')

-- drop all temporary tables built from above script
drop table #resultBuildUp
drop table #tmpDistinctColumns

還考慮了您的要求中指定的“時間”,結果應如下所示

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM