iT邦幫忙

1

SQL 如何將同欄位數據依照條件拆分成不同欄的資料

  • 分享至 

  • xImage

SQL內有以下資料
日期 時間 DeviceName pH
2024-11-12 00:21 100 8.19
2024-11-12 03:51 100 8.19
2024-11-12 00:21 101 7.31
2024-11-12 03:51 101 7.28

為了要做趨勢圖分類,需要將pH資料依照不同的DeviceName拆為不同欄位
日期 時間 pH-100 pH-100
2024-11-12 00:21 8.19 7.31
2024-11-12 03:51 8.19 7.28

請問有沒有什麼方式可以達成?

看更多先前的討論...收起先前的討論...
kw6732 iT邦研究生 3 級 ‧ 2025-02-11 17:32:12 檢舉
你的拆分欄位,想要表達的是什麼呢?我好像看不太懂你說的問題在哪?
HoyaT iT邦新手 5 級 ‧ 2025-02-11 18:41:41 檢舉
kw6732您好,想要依照不同的DeviceName欄位 將原本相同欄位的pH值拆成不同的列
趨勢圖的群組屬性設定到時:分
迪斯堤 iT邦新手 5 級 ‧ 2025-02-14 08:38:42 檢舉
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);

-- 取得所有不同的 device_name 並生成欄位名稱
SELECT @cols = STRING_AGG(QUOTENAME(device_name), ',')
FROM (SELECT DISTINCT device_name FROM YourTableName) AS DistinctDevices;

-- 動態生成 SQL 查詢
SET @query = '
SELECT
Datetime_1, ' + @cols + '
FROM
(SELECT
Datetime_1, device_name, pH
FROM
YourTableName) AS SourceTable
PIVOT
(MAX(pH) FOR device_name IN (' + @cols + ')) AS PivotTable
ORDER BY
Datetime_1;';

-- 執行動態 SQL
EXEC sp_executesql @query;
迪斯堤 iT邦新手 5 級 ‧ 2025-02-14 08:45:50 檢舉
result 如:

Datetime_1 100 101 102 103
2024-11-12 00:21:00.000 8.19 7.31 NULL NULL
2024-11-12 03:51:00.000 8.19 7.28 7.58 6.10
.
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
rogeryao
iT邦超人 7 級 ‧ 2025-02-11 19:03:10
CREATE TABLE aa (
  a1 varchar(20), -- 日期
  a2 varchar(20), -- 時間
  a3 varchar(20), -- DeviceName
  a4 float        -- pH  
);

INSERT INTO aa VALUES 
('2024-11-12','00:21','100',8.19),
('2024-11-12','03:51','100',8.19),
('2024-11-12','00:21','101',7.31),
('2024-11-12','03:51','101',7.28);
SELECT *
FROM (
  SELECT a1,a2,'pH-'+a3 AS a3,a4
  FROM aa
) AS X
PIVOT
(
  SUM(a4)
  FOR a3 IN 
  ([pH-100], [pH-101])
) AS PVT
ORDER BY a1,a2;

Demo

請參閱 : [SQL]使用PIVOT

尼克 iT邦大師 1 級 ‧ 2025-02-12 11:31:11 檢舉

依據內文我猜測,應該是同一個欄位要分拆文字。

kw6732 iT邦研究生 3 級 ‧ 2025-02-13 10:32:46 檢舉

這看起來是正解了~

1
純真的人
iT邦大師 1 級 ‧ 2025-02-12 08:43:33

引用 rogeryao 大大的初始值

依據資料動態內容,直轉橫顯示

create table aa(
  [日期] varchar(20),
  [時間] varchar(20),
  [DeviceName] varchar(20),
  [pH] float
);

INSERT INTO aa VALUES 
('2024-11-12','00:21','100',8.19),
('2024-11-12','03:51','100',8.19),
('2024-11-12','00:21','101',7.31),
('2024-11-12','03:51','101',7.28);
declare @GroupMaxStr nvarchar(max)

select @GroupMaxStr=stuff((
	select ',[pH-' + [DeviceName] + ']'
	from aa a
	group by ',[pH-' + [DeviceName] + ']'
	order by ',[pH-' + [DeviceName] + ']'
	for xml path('')
),1,1,'')

declare @SQL nvarchar(max) = N'
	select [日期]
	,[時間]
	,' + @GroupMaxStr + N'
	from (
		select [日期]
		,[時間]
		,''pH-'' + [DeviceName] [DeviceName]
		,[pH]
		from aa
	) k
	PIVOT
	(
	  Max([pH])
	  FOR [DeviceName] IN 
	  (' + @GroupMaxStr + ')
	) AS PVT
'
exec sp_executesql @SQL

https://ithelp.ithome.com.tw/upload/images/20250212/20061369gHNVGNc0zi.png

測試Demo
https://dbfiddle.uk/j3J2cCJW

1
zivzhong
iT邦研究生 3 級 ‧ 2025-02-12 14:55:34

如果你的 SQL 支援 PIVOT(例如 SQL Server),可以使用:

SELECT *
FROM (
    SELECT 
        日期, 
        時間, 
        DeviceName, 
        pH
    FROM your_table
) AS SourceTable
PIVOT (
    MAX(pH) 
    FOR DeviceName IN ([100], [101])
) AS PivotTable;

0
victorc
iT邦新手 5 級 ‧ 2025-02-17 10:51:08

想問清楚一下,

日期/時間/DeviceName/pH
2024-11-12 00:21 100 8.19
2024-11-12 03:51 100 8.19
2024-11-12 00:21 101 7.31
2024-11-12 03:51 101 7.28

DeviceName 是 100, 101
pH 是 8.19,7.31, 7.28 ?

我要發表回答

立即登入回答