我有以下挑戰:我有一個名為的表hashtags_users_grouped,它具有以下結構:
hashtag_id | user_id | count
123 1 1
245 1 3
123 2 5
在每一行中,我們都會找到一些值,這些值告訴我某個用戶何時提到某個主題標簽以及他這樣做了多少次。在這個例子中,用戶 1 提到了話題標簽 123 1 次,提到了 3 次 245,而用戶 2 只提到了話題標簽 123 5 次。
我想做一個查詢,它會給我以下輸出:
user | hashtag_123 | hashtag_245
1 1 3
2 5 0
換句話說,與第一個表相同的資訊,但每個主題標簽有一列,以了解用戶提到每個主題標簽的次數。
使用遞回方法很容易做到這一點(比如使用 Pyspark 資料框并迭代每個主題標簽),但我期待在單個查詢中實作它。你知道有什么方法可以做到這一點嗎?
編輯:用戶#Larnu 說我應該使用PIVOT. 您將如何使用它撰寫查詢?我試過了,但沒有收到預期的結果
uj5u.com熱心網友回復:
鑒于您指定的列命名和未知的主題標簽值串列,我看到您求助于動態 SQL。
但是,這里有一個簡單的 PIVOT 示例,它基于您共享的資料,您可以在 SSMS 中運行這些資料:
DECLARE @hashtags_users_grouped table (
hashtag_id int, [user_id] int, [count] int
);
INSERT INTO @hashtags_users_grouped VALUES
( 123, 1, 1 ), ( 245, 1, 3 ), ( 123, 2, 5 );
SELECT
[user_id],
ISNULL( [123], 0 ) AS hashtag_123,
ISNULL( [245], 0 ) AS hashtag_245
FROM @hashtags_users_grouped AS hug
PIVOT (
MAX ( [count] )
FOR hashtag_id IN ( [123], [245] )
) piv;
退貨
--------- ------------- -------------
| user_id | hashtag_123 | hashtag_245 |
--------- ------------- -------------
| 1 | 1 | 3 |
| 2 | 5 | 0 |
--------- ------------- -------------
在 a 中PIVOT,您的列值(例如 123, 245 )被轉置為列標題,因此是FOR hashtag_id IN ( [123], [245] )部分。要在沒有動態 SQL 的情況下執行此操作,您必須為每個可能的 hashtag_id 值列出一個“FOR [column]”。鑒于此串列的大小未知,當引入新值時,嘗試維護上述代碼將很快變得難以管理。所以,動態 SQL 來救援。
根據您的 SQL Server 版本,這是我使用動態 SQL 處理它的方式:
DECLARE @headers varchar(MAX), @in varchar(MAX), @pivot varchar(MAX);
SELECT
@headers = STRING_AGG ( FORMATMESSAGE( 'ISNULL( [%i], 0 ) AS [hashtag_%i]', hashtag_id, hashtag_id ), ', ' ),
@in = STRING_AGG( FORMATMESSAGE( '[%i]', hashtag_id ), ', ' )
FROM ( SELECT DISTINCT hashtag_id FROM hashtags_users_grouped ) AS x;
SET @pivot = FORMATMESSAGE(
'SELECT [user_id], %s FROM hashtags_users_grouped PIVOT ( MAX( [count] ) FOR hashtag_id IN ( %s ) ) AS piv;'
, @headers
, @in
);
PRINT @headers;
PRINT @in;
PRINT @pivot;
列印@headers;
ISNULL( [123], 0 ) AS [hashtag_123], ISNULL( [245], 0 ) AS [hashtag_245]
列印@in;
[123], [245]
列印@pivot;
SELECT [user_id], ISNULL( [123], 0 ) AS [hashtag_123], ISNULL( [245], 0 ) AS [hashtag_245] FROM hashtags_users_grouped PIVOT ( MAX( [count] ) FOR hashtag_id IN ( [123], [245] ) ) AS piv;
最后,要執行動態 SQL:
EXEC ( @pivot );
注意:動態 SQL 示例不參考表變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/368403.html
標籤:sql sql-server
