Сводки SQL Server: отображение значений строк в заголовках столбцов - PullRequest
4 голосов
/ 06 марта 2012

У меня есть таблица (товары) в следующем формате:

ITEMNO | WEEKNO | VALUE  
A1234  |   1    |  805  
A2345  |   2    |  14.50  
A3547  |   2    |  1396.70  
A2208  |   1    |  17.65  
A4326  |   6    |  19.99

Это таблица, которая показывает стоимость продаж товаров за данную неделю.

Результатыили что я хочу отобразить в табличном формате, это номер элемента в строке, за которым следуют столбцы для каждой недели, содержащие значения, например

ITEMNO | WK1 | WK2 | WK3 | WK4 | WK5  ...etc up to 52  
A1234  | 805 | 345 | 234 | 12  | 10   ...etc up to 52  
A2345  |  23 | 12  | 456 | 34  | 99   ...etc up to 52  
A3456  | 234 | 123 | 34  | 25  | 190  ...etc up to 52  

Хотя у меня 52 ... так что у меня толькоданные за неделю до 9, но они будут увеличиваться со временем.

Поэтому в основном я хочу отобразить значение номера недели в качестве заголовка столбца.

Возможно ли это ...Хотя у меня возникает соблазн просто получить данные и правильно отобразить их с помощью кода / (asp.net), но мне было интересно, есть ли возможность показать это в SQL?

Кто-нибудь знает или думает, чточто это может быть лучшим способом?

Ответы [ 5 ]

8 голосов
/ 06 марта 2012

Есть два способа сделать это со статическим SQL и динамическим SQL:

Статическая ось:

SELECT P.ItemNo, IsNull(P.[1], 0) as Wk1, IsNull(P.[2], 0) as Wk2
    , IsNull(P.[3], 0) as Wk3, IsNull(P.[4], 0) as Wk4
    , IsNull(P.[5], 0) as Wk5, IsNull(P.[6], 0) as Wk6
    , IsNull(P.[7], 0) as Wk7, IsNull(P.[8], 0) as Wk8
    , IsNull(P.[9], 0) as Wk9
FROM
(
    SELECT ItemNo, WeekNo, [Value]
    FROM dbo.Items
) I
PIVOT
(
    SUM([Value])
    FOR WeekNo IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])
) as P

Динамический круг:

DECLARE
@cols AS NVARCHAR(MAX),
@y    AS INT,
@sql  AS NVARCHAR(MAX);

-- Construct the column list for the IN clause
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(w) AS [text()]
FROM (SELECT DISTINCT WeekNo AS W FROM dbo.Items) AS W
ORDER BY W
FOR XML PATH('')),
1, 1, N'');


-- Construct the full T-SQL statement
-- and execute dynamically
SET @sql = N'SELECT *
            FROM (SELECT ItemNo, WeekNo, Value
                    FROM dbo.Items) AS I
            PIVOT(SUM(Value) FOR WeekNo IN(' + @cols + N')) AS P;';

EXEC sp_executesql @sql;
GO
3 голосов
/ 06 марта 2012

Может быть что-то вроде этого:

Данные теста

CREATE TABLE #tbl 
    (
        ITEMNO VARCHAR(100),
        WEEKNO INT, 
        VALUE FLOAT
    )

INSERT INTO #tbl
VALUES
    ('A1234',1,805),
    ('A2345',2,14.50),  
    ('A3547',2,1396.70),  
    ('A2208',1,17.65),
    ('A4326',6,19.99)

Столбцы недели

DECLARE @cols VARCHAR(MAX)

;WITH Nbrs ( n ) AS (
        SELECT 1 UNION ALL
        SELECT 1 + n FROM Nbrs WHERE n < 52 )
SELECT @cols = COALESCE(@cols + ','+QUOTENAME('WK'+CAST(n AS VARCHAR(2))),
                     QUOTENAME('WK'+CAST(n AS VARCHAR(2))))
FROM
    Nbrs

Только включенные недели

DECLARE @cols VARCHAR(MAX)
;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY WEEKNO ORDER BY WEEKNO) AS RowNbr,
        WEEKNO
    FROM
        #tbl
)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME('WK'+CAST(WEEKNO AS VARCHAR(2))),
                     QUOTENAME('WK'+CAST(WEEKNO AS VARCHAR(2))))
FROM
    CTE
WHERE
    CTE.RowNbr=1

Динамический круг

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        tbl.ITEMNO,
        ''WK''+CAST(tbl.WEEKNO AS VARCHAR(2)) AS WEEKNO,
        tbl.VALUE
    FROM
        #tbl as tbl
) AS p
PIVOT
(
    SUM(VALUE)
    FOR WEEKNO IN ('+@cols+')
) AS pvt'
EXECUTE(@query)

Отбросить временную таблицу

DROP TABLE #tbl
1 голос
/ 06 марта 2012

Следуйте инструкциям ниже, что ясно объясняет

http://www.tsqltutorials.com/pivot.php

1 голос
/ 06 марта 2012

Вы можете использовать PIVOT , если хотите сделать это в sql напрямую.

Для этого может быть более эффективно использовать SQL Server, а не клиента, в зависимости от размера данных и агрегирования.

1 голос
/ 06 марта 2012

Используйте Pivot , хотя довольно много кода .. Если вы создаете отчет в службах отчетности, можете использовать матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...