![](/img/trans.png)
[英]Can I combine values from multiple rows in another table into multiple columns of one row using 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.