2012-03-29 83 views
0

這裏有關SQL方案的另一個愚蠢問題。SQL查詢 - 幾乎像數據透視表一樣?

給出的數據,如:

FieldKey DocumentKey FieldId FieldValue 
1 00001c55-aab3-4df8-a07e-8eac162fa075 TITLE Mass Import 18355 
2 00001c55-aab3-4df8-a07e-8eac162fa075 1 00001c55-aab3-4df8-a07e-8eac162fa075 
3 00001c55-aab3-4df8-a07e-8eac162fa075 2 9F-2F-CF-76-27-E7-5B-C9-27-CE-23-45-68-3F-E2-89 
4 00001c55-aab3-4df8-a07e-8eac162fa075 3 18355 
5 00001c55-aab3-4df8-a07e-8eac162fa075 4 94-3C-84-B1-6A-AA-FD-25-F1-C0-D2-43-CD-D3-57-D6 
6 00001c55-aab3-4df8-a07e-8eac162fa075 5 Created by C# mass import 
7 00002205-00D3-4495-B65A-A7B1FD2AE7F2 TITLE Mass Import 1494780 
8 00002205-00D3-4495-B65A-A7B1FD2AE7F2 1 00002205-00D3-4495-B65A-A7B1FD2AE7F2 
9 00002205-00D3-4495-B65A-A7B1FD2AE7F2 2 870386312 
10 00002205-00D3-4495-B65A-A7B1FD2AE7F2 3 1494780 
11 00002205-00D3-4495-B65A-A7B1FD2AE7F2 4 -1929051324 
13 00002342-6de0-4110-b576-fd32f96b2858 TITLE Mass Import 387008 
14 00002342-6de0-4110-b576-fd32f96b2858 1 00002342-6de0-4110-b576-fd32f96b2858 
15 00002342-6de0-4110-b576-fd32f96b2858 2 B0-CB-DF-ED-48-DC-C4-E8-B0-6F-1B-1D-81-2D-6D-51 
16 00002342-6de0-4110-b576-fd32f96b2858 3 387008 

隨着表結構:

[FieldKey] [bigint] IDENTITY(1,1) NOT NULL, 
[DocumentKey] [char](36) NOT NULL, 
[FieldId] [varchar](10) NOT NULL, 
[FieldValue] [varchar](255) NOT NULL 

是什麼水平翻轉這個數據的最佳方式?理想的情況是:

DocumentKey        TITLE 1 2 3 4 5 
00001c55-aab3-4df8-a07e-8eac162fa075 mytitle val1 val2 val3 val4 val5 
00002205-00D3-4495-B65A-A7B1FD2AE7F2 mytitle2 val6 val7 val8 val9 
00002342-6de0-4110-b576-fd32f96b2858 mytitle3 vl10 vl11 vl12 

我認爲數據透視表可能會奏效,它是接近的,但問題是我不需要這是需要一個SQL樞紐匯聚。我只想翻轉數據。列的數量(在我的例子中爲1-5加TITLE)可以是TITLE加1-30之間的任何值。

也許我只是密集,但任何想法,將不勝感激。

回答

2

我認爲你是在正確的軌道與PIVOT上。您將在值列上有一個聚合。但正如你所說,你將有1-30列加上標題欄。這需要一個動態的支點

這裏有一個建議(即僅用於SQL Server 2005 +):

測試數據

CREATE TABLE Table1 
(
    [FieldKey] [bigint] NOT NULL, 
    [DocumentKey] [char](36) NOT NULL, 
    [FieldId] [varchar](10) NOT NULL, 
    [FieldValue] [varchar](255) NOT NULL 
) 
INSERT INTO Table1 
VALUES 
    (1,'00001c55-aab3-4df8-a07e-8eac162fa075','TITLE','Mass Import 18355'), 
    (2,'00001c55-aab3-4df8-a07e-8eac162fa075','1','00001c55-aab3-4df8-a07e-8eac162fa075'), 
    (3,'00001c55-aab3-4df8-a07e-8eac162fa075','2','9F-2F-CF-76-27-E7-5B-C9-27-CE-23-45-68-3F-E2-89'), 
    (4,'00001c55-aab3-4df8-a07e-8eac162fa075','3','18355'), 
    (5,'00001c55-aab3-4df8-a07e-8eac162fa075','4','94-3C-84-B1-6A-AA-FD-25-F1-C0-D2-43-CD-D3-57-D6'), 
    (6,'00001c55-aab3-4df8-a07e-8eac162fa075','5','Created by C# mass import'), 
    (7,'00002205-00D3-4495-B65A-A7B1FD2AE7F2','TITLE','Mass Import 1494780'), 
    (8,'00002205-00D3-4495-B65A-A7B1FD2AE7F2','1','00002205-00D3-4495-B65A-A7B1FD2AE7F2'), 
    (9,'00002205-00D3-4495-B65A-A7B1FD2AE7F2','2','870386312'), 
    (10,'00002205-00D3-4495-B65A-A7B1FD2AE7F2','3','1494780'), 
    (11,'00002205-00D3-4495-B65A-A7B1FD2AE7F2','4','-1929051324'), 
    (13,'00002342-6de0-4110-b576-fd32f96b2858','TITLE','Mass Import 387008'), 
    (14,'00002342-6de0-4110-b576-fd32f96b2858','1','00002342-6de0-4110-b576-fd32f96b2858'), 
    (15,'00002342-6de0-4110-b576-fd32f96b2858','2','B0-CB-DF-ED-48-DC-C4-E8-B0-6F-1B-1D-81-2D-6D-51'), 
    (16,'00002342-6de0-4110-b576-fd32f96b2858','3','387008') 

找到唯一列

DECLARE @cols VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY Table1.FieldId 
           ORDER BY Table1.FieldId) AS RowNbr, 
     Table1.* 
    FROM 
     Table1 
) 
SELECT @cols=STUFF 
(
    (
     SELECT 
      ',' +QUOTENAME(CTE.FieldId) 
     FROM 
      CTE 
     WHERE 
      CTE.RowNbr=1 
     ORDER BY 
      LEN(CTE.FieldId) DESC, 
      CTE.FieldId 
     FOR XML PATH('') 
    ) 
,1,1,'') 

我們需要訂購以便TITLE排名第一。 FOR XML PATH用於連接列。

動態樞

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
    SELECT 
     Table1.DocumentKey, 
     Table1.FieldId, 
     Table1.FieldValue 
    FROM 
     Table1 
) AS p 
PIVOT 
(
    MAX(FieldValue) 
    FOR FieldId IN('[email protected]+') 
) AS p' 
EXECUTE(@query) 

清潔自己(不要求)經過長達

DROP TABLE Table1 
2

如果您使用SQL Server 2005+,則可以使用PIVOT運算符。

select [DocumentKey], [TITLE], [1], [2], [3], [4], [5] 
from (select [DocumentKey], FieldId, FieldValue from TableName) t 
    pivot (max(FieldValue) for FieldID in ([TITLE], [1], [2], [3], [4], [5])) as pvt 
order by [DocumentKey] 

你將不得不增加額外的列,6 - 30

+1

我不認爲OP想要一個靜態的支點。如果色譜柱在1-30之間變化,這將不予考慮。 – Arion 2012-03-29 21:33:28

+1

當然,它會 - 添加所有30列,如果列不存在,它將只有一個空值。認爲問題的要點是「......問題是我不需要一個SQL數據透視表所需的聚合,我只是想要翻轉數據。」只需使用MAX功能。 – jim31415 2012-03-29 22:02:25

+0

都是真的:)我們最終可能有超過30列,所以動態是偉大的,雖然在短期內是不必要的。 – Kettch19 2012-03-29 22:11:18