Intereting Posts
Есть ли лучший способ извлечь время суток? Fnd последовательных дат с определенным интервалом, в котором доступен тренер для расписания Правильный синтаксис для запроса таблицы 3 SELECT ORA-00903: недопустимое имя таблицы на PreparedStatement Выберите лучшие результаты, упорядоченные по частоте Выберите данные из трех таблиц? PostgreSQL 9.3: выбор фильтра в сводной таблице Антенна sql вставляется в строку «-». обходной путь? Как взорваться в MySQL и использовать его в предложении WHERE запроса – MySQL Почему рекомендуется избегать однонаправленной связи «один-ко-многим» с внешним ключом? Фильтрация таблицы EAV с несколькими условиями Разница между языком sql и языком plpgsql в функциях PostgreSQL С Hibernate, как я могу запросить таблицу и вернуть хэш-карту с ключом пары id> name? Создание диапазона дат с использованием SQL Вызовите функцию доступа вне доступа с помощью VB NET

SQL – сводная таблица и группа, не работающие

У меня есть таблица следующим образом:

Product #users Date Count Type prodA 29 2013-02-27 113 Document prodA 31 2013-03-02 152 Extraction prodB 17 2013-02-26 40 Document prodB 28 2013-03-02 73 Extraction 

Мне нужно использовать сводную таблицу в столбце [Тип] / Счет и получить таблицу следующим образом:

 Product #users Date Document Extraction prodA 60 2013-03-02 113 152 prodB 45 2013-03-02 40 73 

где столбец #user представляет собой группу сумм по продукту, а Date – это максимальная группа дат по продукту.

Это то, что я получил до сих пор:

 SELECT Product, sum(users), max([Date]), [Document],[Extraction] FROM Table PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction)) AS [QUANTITY] GROUP BY activity, document, extraction 

но мои конечные результаты дают мне нечто подобное:

 Product #users Date Document Extraction prodA 31 2013-03-02 NULL 152 prodA 29 2013-02-27 113 NULL prodB 28 2013-03-02 NULL 73 prodB 17 2013-02-26 40 NULL 

Он не группируется по Продукту!

Есть идеи?

РЕДАКТИРОВАТЬ:

До сих пор у меня есть

 WITH Pivoted AS ( SELECT * FROM table1 PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction) ) AS p ) SELECT product, SUM(Users) AS TotalUsers, MAX(DAte) AS LatestDate, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM Pivoted GROUP BY Product; 

но моя таблица1 выше действительно состоит из следующих кодов:

 WITH a AS( SELECT activity, username, [Last Accessed] = max(DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0)), --[#Users] = count(distinct username), CASE WHEN COUNT(activity)IS NOT NULL THEN 1 ELSE 0 END AS Count, CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END AS [Type] --into #temp from activitylog where pageURL not like '%home%' AND pageURL not like '/Default%' --AND ActDateTime >= @StartDate AND ActDateTime <= @EndDate group by activity, username, --department, DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0), CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END --order by activity--, username, department,DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0) ) ,b as (select activity, count(distinct username) as [Users] , --department , max([Last Accessed]) as [Last Accessed1],count([count])as [Count],[Type] from a --into #temp1 from #temp group by activity, --department, [Type] ) select * from b order by activity; 

поэтому мой вопрос: КАК я помещаю кусок кода выше, который делает Table1 в первом WITH AS?

благодаря

PIVOT GROUP BY activity, document, extraction в операторе таблицы PIVOT оператор PIVOT автоматически группирует столбцы. Но вы можете написать так:

 WITH Pivoted AS ( SELECT * FROM table1 PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction) ) AS p ) SELECT product, SUM(Users) AS TotalUsers, MAX(DAte) AS LatestDate, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM Pivoted GROUP BY Product; 

Демо-версия SQL Fiddle

Это даст вам:

 | PRODUCT | TOTALUSERS | LATESTDATE | DOCUMENT | EXTRACTION | ------------------------------------------------------------------------------- | prodA | 60 | March, 02 2013 02:00:00+0000 | 113 | 152 | | prodB | 45 | March, 02 2013 02:00:00+0000 | 40 | 73 | 

Обновление 1

 WITH a AS( SELECT activity, username, [Last Accessed] = max(DATEADD(dd, DATEDIFF(d, 0, ActDateTime), 0)), --[#Users] = count(distinct username), CASE WHEN COUNT(activity) IS NOT NULL THEN 1 ELSE 0 END AS Count, CASE WHEN pageURL LIKE '/Document%' OR pageURL LIKE '/Database%' THEN 'Document' ELSE 'Extraction' END AS [Type] from activitylog where pageURL not like '%home%' AND pageURL not like '/Default%' group by activity, username, ... ), Pivoted AS ( SELECT * FROM a PIVOT ( sum([Count]) FOR [Type] IN ( Document , Extraction) ) AS p ) SELECT product, SUM(Users) AS TotalUsers, MAX(DAte) AS LatestDate, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM Pivoted GROUP BY Product; 

Вы можете добиться этого с помощью CTE.

 ;WITH CTE AS ( SELECT * FROM Sample PIVOT (SUM([COUNT]) FOR [TYPE] IN (Document, Extraction)) AS PI ) SELECT Product, SUM(Users) AS Users, MAX(Date) AS Date, MAX(Document) AS Document, MAX(Extraction) AS Extraction FROM CTE GROUP BY Product; 

Демо-версия SQL Fiddle