2017-01-26 4 views
0

Die folgende Abfrage erhalten die folgenden heraus gestellt.Pivot sql konvertieren Zeilen in Spalten

Service Date Product1 Product2 
01/Jun/2015 1   3 
02/Jun/2015 2   5 

Stattdessen möchte ich das Datum in den Spalten so out Put sollte so sein.

Products 01/Jun/2015 02/Jun/2015 
Product1 1   3 
Product2 2   5 

Abfrage

DECLARE @cols AS nvarchar(max), 
     @query AS nvarchar(max) 
SELECT 
    @cols = STUFF((SELECT 
    ',' + QUOTENAME(Product_Name) 
    FROM dbo.Store where CatID='2' 

    GROUP BY Product_Name 
    ORDER BY Product_Name 
    FOR xml PATH (''), TYPE) 
    .value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
SET @query = 'SELECT Replace(CONVERT(NVARCHAR, Service_Date, 106), '' '', ''/'') AS [Service Date],' + @cols + ' from (select Service.Service_Date, Store.Product_Name, Servicelist.ProductQty FROM dbo.Service INNER JOIN dbo.Servicelist ON dbo.Service.Service_ID = dbo.Servicelist.Service_ID INNER JOIN dbo.Store ON dbo.Servicelist.Pro_ID = dbo.Store.Pro_ID) x pivot (SUM(ProductQty) for Product_Name in (' + @cols + ')) p ' 
EXECUTE (@query); 

Antwort

0

Ihre aktuelle Abfrage Produktnamen Schwenken und die Daten zu gruppieren. Aber Sie müssen die Daten und die Gruppe

Versuchen Sie, diese Art und Weise

DECLARE @cols AS NVARCHAR(max), 
     @query AS NVARCHAR(max) 

die eindeutige Liste statt Produktnamen von Terminen finden die Produktnamen verschwenken

SELECT @cols = Stuff((SELECT ',' 
          + Quotename(CONVERT(char(11), Service_Date, 106)) 
         FROM dbo.Store 
         WHERE CatID = '2' 
         GROUP BY CONVERT(char(11), Service_Date, 106) 
         ORDER BY CONVERT(date, Service_Date) 
         FOR xml PATH (''), TYPE) .value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

In Pivot for Liste der Service_date verwenden spalte statt Product_Name

SET @query = 'SELECT Product_Name,' 
      + @cols 
      + ' from (select Service.Service_Date, Store.Product_Name, Servicelist.ProductQty FROM dbo.Service INNER JOIN dbo.Servicelist ON dbo.Service.Service_ID = dbo.Servicelist.Service_ID INNER JOIN dbo.Store ON dbo.Servicelist.Pro_ID = dbo.Store.Pro_ID) x pivot (SUM(ProductQty) for CONVERT(char(11), Service_Date, 106) in (' 
      + @cols + ')) p ' 

EXECUTE (@query); 
0

So wird das einfache ANSI SQL verwendet.

Zuerst müssen Sie vertikal - UNPIVOT in TRANSACT-SQL sprechen - was Sie tun, indem Sie CROSS JOINing mit einer einzigen Spalte temporäre Tabelle mit so vielen aufeinanderfolgenden Ganzzahlen wie Sie Werte zu "pivot" haben. Sie verwenden diese Ganzzahlen als Indizes in einem CASE WHEN-Ausdruck für die Werte.

Anschließend werden Sie mit einem SUM (CASE WHEN ...) - Ausdruck und GROUP BY der Spalte, deren Werte vertikal in der ersten Spalte angezeigt werden sollen, neu ausgerichtet.

Hier geht:

WITH 
-- input 
input(Service_Date,Product1,Product2) AS (
      SELECT DATE '2015-06-01',1,3 
UNION ALL SELECT DATE '2015-06-02',2,5 
)   
, 
-- start vertical pivot: two integers 
two_ints(idx) AS (SELECT 1 UNION ALL SELECT 2) 
, 
-- vertical pivot: CROSS JOIN input with two integers 
vert_pivot AS (
SELECT 
    Service_Date 
, idx 
, 'Product'||CAST(idx AS CHAR(1)) AS product 
, CASE idx WHEN 1 THEN Product1 WHEN 2 THEN Product2 END AS qty 
FROM input CROSS JOIN two_ints 
) 
-- debug 
-- SELECT * FROM vert_pivot; 
-- Service_Date|idx|product |qty 
-- 2015-06-01 | 1|Product1| 1 
-- 2015-06-01 | 2|Product2| 3 
-- 2015-06-02 | 1|Product1| 2 
-- 2015-06-02 | 2|Product2| 5 
, 
-- re-pivot horizontally by date 
horiz_pivot_dt AS (
SELECT 
    product 
, SUM(CASE Service_Date WHEN '2015-06-01' THEN qty END) AS "2015-06-01" 
, SUM(CASE Service_Date WHEN '2015-06-02' THEN qty END) AS "2015-06-02" 
FROM vert_pivot 
GROUP BY 
    product 
) 
SELECT * FROM horiz_pivot_dt 
; 
-- result: 
-- product |2015-06-01|2015-06-02 
-- Product1|   1|   2 
-- Product2|   3|   5 

durch die Art und Weise: Ich stellte fest, dass Sie nur die „Spaltennamen“ geschwenkt und die ersten Spalte der Wert - nicht die Maßnahmen. Mein Beispiel oben tat, und ich verbrachte ein paar Minuten versucht, um herauszufinden, wo mein Fehler ....

Glückliches Spiel war ... marco

Verwandte Themen