久久久久久久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)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 亚洲va欧美va天堂v国产综合 | 亚洲综合在线网 | 久久久精| 国产欧美一级 | 91视视频在线观看入口直接观看 | 国产成人综合网 | 精品国产91乱码一区二区三区 | 福利电影在线 | 国产伊人精品 | 亚洲一区二区三区在线视频 | 一级在线免费观看 | 国产精品久久久久久久久久 | 精品成人免费一区二区在线播放 | 亚洲精品电影在线观看 | 国产成人免费视频网站高清观看视频 | 久久久久久久夜 | 超碰激情 | 欧美一a一片一级一片 | 欧美一级视频免费看 | 成人av在线网站 | 欧美日韩精品一区二区三区四区 | 日韩一区二区福利 | 久久久久亚洲精品 | 国产免费又色又爽又黄在线观看 | 超碰在线播 | 国产免费视频在线 | av大片在线观看 | 国产欧美日韩在线观看 | 免费艹逼视频 | a在线v| 亚洲精品视频一区二区三区 | 国产九九av | 国产精品99999999| 99免费视频| 亚洲精品欧美 | 亚洲精品久久久一区二区三区 | h视频免费观看 | 久久综合久 | 午夜视频在线免费观看 | 亚洲精品日韩一区二区电影 | 男人天堂网址 |