Как отобразить значения из одного столбца в два столбца в операторе SQL? - PullRequest
1 голос
/ 01 марта 2012

У меня есть таблица, как показано ниже:

enter image description here

Существует несколько идентификаторов WebSiteID.Я хотел бы, чтобы результат был таким, как показано ниже:

Date  , WebSiteID1_Views, WebSiteID2_Views
1/1/12, 91              , 43
1/2/12, 84              , 34

(where SiteUSerID = some userdefined ID)

Я почти уверен, что мне нужно выполнить какое-то соединение, но я не могу найтиответ на стек.

Ваша помощь очень ценится!

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Это способ PIVOT:

SELECT [Date],
       COALESCE([1], 0) AS WebSiteID1_Views,
       COALESCE([2], 0) AS WebSiteID2_Views
FROM (
    SELECT [Date], WebSiteID, WebSiteViews
    FROM @yourTable
    WHERE SiteUSerID = [some userdefined ID]
) AS T
PIVOT(SUM(WebSiteViews) FOR WebSiteID IN([1], [2])) AS P

... И путь не PIVOT:

SELECT
    [Date],
    SUM(CASE WebSiteID WHEN 1 THEN WebSiteViews ELSE 0 END) AS WebSiteID1_Views,
    SUM(CASE WebSiteID WHEN 2 THEN WebSiteViews ELSE 0 END) AS WebSiteID2_Views
FROM @yourTable
WHERE SiteUSerID = [some userdefined ID]
GROUP BY Date
0 голосов
/ 07 марта 2012

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

Данные испытаний

CREATE TABLE Table1
        (
            ID INT,
            Date DATETIME,
            SiteUser INT,
            WebSiteID INT,
            WebSiteViews INT
        )
INSERT INTO Table1
VALUES
    (1,'2011-10-06 00:00:00:000',36,1,197),
    (2,'2011-10-06 00:00:00:000',37,1,70),
    (3,'2011-10-06 00:00:00:000',36,1,111),
    (4,'2011-10-06 00:00:00:000',32,1,24),
    (5,'2012-02-26 00:00:00:000',31,1,37),
    (6,'2012-02-26 00:00:00:000',36,1,92),
    (7,'2012-02-26 00:00:00:000',34,1,50),
    (8,'2012-02-26 00:00:00:000',18,1,43),
    (9,'2012-02-26 00:00:00:000',89,1,12),
    (10,'2012-02-15 00:00:00:000',45,2,45),
    (11,'2012-02-15 00:00:00:000',78,2,54),
    (12,'2012-03-24 00:00:00:000',36,2,45),
    (13,'2012-03-24 00:00:00:000',36,2,197),
    (14,'2012-03-24 00:00:00:000',45,2,300),
    (15,'2012-03-24 00:00:00:000',3,2,78),
    (16,'2012-03-24 00:00:00:000',2,2,45),
    (17,'2012-03-24 00:00:00:000',1,2,100),
    (18,'2012-03-24 00:00:00:000',4,2,1)

Уникальные имена столбцов

DECLARE @cols VARCHAR(MAX)
;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY Table1.WebSiteID ORDER BY Table1.WebSiteID) AS RowNbr,
        CAST(Table1.WebSiteID AS VARCHAR(100)) AS WebSiteID
    FROM
        Table1
)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME('WebSiteID'+WebSiteID+'_Views'),
                    QUOTENAME('WebSiteID'+WebSiteID+'_Views'))
FROM
    CTE
WHERE
    CTE.RowNbr=1

Динамический пивот

DECLARE @SiteUser INT=36
DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        convert(varchar(6), Date, 103)+RIGHT(CAST(YEAR(Date) AS VARCHAR(4)),2) AS Date,
        Table1.WebSiteViews,
        ''WebSiteID''+CAST(WebSiteID AS VARCHAR(100))+''_Views'' AS WebSiteID
    FROM
        Table1
    WHERE
        Table1.SiteUser='+CAST(@SiteUser AS VARCHAR(100))+'
) AS p
PIVOT
(
    SUM(WebSiteViews)
    FOR WebSiteID IN ('+@cols+')
)AS pvt'
EXECUTE(@query)

В моем случае я опущу временную таблицу:

DROP TABLE Table1
0 голосов
/ 01 марта 2012

То, что вы хотите, это динамически собранный круг.

Таким образом, вы можете иметь несколько неопределенных WebSiteID значений и все равно будут работать.

У меня сейчас нет времени, чтобы написать конкретный ответ на ваш вопрос, но вы можете найти аналоговое решение здесь: https://stackoverflow.com/a/7182489/570191

Просто адаптируйте его под свои потребности

...