久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

將表從行轉換為列

Transform a table from rows to columns(將表從行轉換為列)
本文介紹了將表從行轉換為列的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我得到了以下形式的有序 Microsoft Server 表:

I got an ordered Microsoft Server table of the following form:

    Name   Product
  ------------------
1 | Mayer  Product_1
2 | Mayer  Product_1
3 | Mayer  Product_2

我想得到以下結果:

    Name   Purchase_1 Purchase_2 Purchase_3
  -----------------------------------------
1 | Mayer  Product_1  Product_1  Product_2

代碼必須適用于任意長度的購買和名稱,這意味著我不知道這些信息.

The code has to work for an arbitrary length of purchases and names, meaning I don't know these information upfront.

推薦答案

Dynamic PIVOT 是你的朋友 :

現場演示

CREATE TABLE #mytable(
   Name  VARCHAR(80) NOT NULL 
  ,Product VARCHAR(160) NOT NULL
);
INSERT INTO #mytable VALUES ('Mayer','Product_1');
INSERT INTO #mytable VALUES ('Mayer','Product_1');
INSERT INTO #mytable VALUES ('Mayer','Product_2');
INSERT INTO #mytable VALUES ('Kowalsky','Product_1');
INSERT INTO #mytable VALUES ('Kowalsky','Product_2');
INSERT INTO #mytable VALUES ('Kowalsky','Product_3');
INSERT INTO #mytable VALUES ('Kowalsky','Product_4');

DECLARE @cols  NVARCHAR(MAX),
        @cols_piv NVARCHAR(MAX),
        @query NVARCHAR(MAX)
        ,@max  INT = 0;

SELECT @max = MAX(c)
FROM (
  SELECT Name, COUNT(Product) AS c
  FROM #mytable
  GROUP BY Name) AS s;

SET @cols = STUFF(     
            (SELECT ',' +  CONCAT('[',c.n, '] AS Purchase_',c.n, ' ')
            FROM  ( SELECT TOP (1000) n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects ORDER BY n)AS c(n)
            WHERE c.n <= @max
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @cols_piv = STUFF(
            (SELECT ',' +  CONCAT('[',c.n, '] ')
            FROM  ( SELECT TOP (1000) n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects ORDER BY n)AS c(n)
            WHERE c.n <= @max
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');        

SET @query = N'SELECT Name, ' + @cols + ' from 
            (
                select Name, Product,
                [rn] = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Product)
                from #mytable
            ) x
            pivot 
            (
                max(Product)
                for rn in (' + @cols_piv + ')
            ) p ';

-- SELECT @query; 

EXEC [dbo].[sp_executesql]
    @query;

一開始可能會很復雜,但這真的很簡單.正常的PIVOT 需要你提前知道列列表.在您的情況下,這不是一個選項,因此您需要生成列并使用 Dynamic-SQL.

It may be complicated at first but this is really simple. Normal PIVOT requires you to know column list in advance. This is not an option in your case so you need to generate column and use Dynamic-SQL.

工作原理:

  1. @max 包含每行的最大列數
  2. @cols 包含帶有別名的 SELECT 列列表
  3. @cols_piv 包含數字列表 [1], [2], ... @max
  4. 將它與普通的 PIVOT 查詢連接
  5. 執行它并享受你的結果.
  1. @max contains max number of columns per row
  2. @cols contains SELECT column list with aliases
  3. @cols_piv contains list of numbers [1], [2], ... @max
  4. Concatenate it with normal PIVOT query
  5. Execute it and enjoy your results.

警告:

  • 我使用 sys.objects 作為我的數字生成器.您可以將其替換為您想要的(遞歸 CTE/多步 CTE/tally 表...).

  • I've used sys.objects as my number generator. You can replace it with what you want (recursive CTE/multistep CTE/tally table ...).

如果您使用的是 SQL Server 2008,則需要將 CONCAT 替換為 +.

If you are using SQL Server 2008 you need to replace CONCAT with +.

這篇關于將表從行轉換為列的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 欧美一级欧美一级在线播放 | 成人精品一区二区 | 久久99精品久久久97夜夜嗨 | 亚洲自拍一区在线观看 | 国产探花在线精品一区二区 | 日本一卡精品视频免费 | aaa精品 | 91久久北条麻妃一区二区三区 | 精品国产区 | 国产免费播放视频 | 国产精品视频一二三区 | 狠狠操狠狠搞 | 国产精品久久久久久久久婷婷 | 99久久精品国产一区二区三区 | 久久久久久国产精品免费免费 | 午夜网| 亚洲精品一区二三区不卡 | 韩日三级| 超碰97干| 亚洲视频一区二区三区 | 日韩成人在线网站 | 久久91| 性做久久久久久免费观看欧美 | 秋霞影院一区二区 | 九九热这里只有精品6 | 亚洲精精品 | 手机av网 | 国产精品美女久久久久久免费 | 在线观看日本高清二区 | 91视频在线看 | 男人的天堂视频网站 | 亚洲精品乱码久久久久久蜜桃91 | 久久亚洲欧美日韩精品专区 | wwwxx在线观看 | 久久久国产一区二区三区 | 欧美专区在线观看 | 亚洲视频在线一区 | 精品免费观看 | 午夜爱爱网 | 97久久久久久久久 | 精品欧美乱码久久久久久 |