Заменить представление подзапросом - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть таблица с этими данными:

ID | Date           | MacroID  | FunctionID
---------------------------------------
1  | 1.1.2010 10:00 | core     | coreP1
2  | 2.1.2010 11:11 | main     | mainP7
3  | 1.1.2010 17:01 | core     | coreP2
4  | 3.1.2011 21:00 | top      | topP7
5  | 1.1.2010 11:11 | left     | leftP0

и мне нужно получить:

Date     | Sum_Macro |
----------------------
1.1.2010 | 2
2.1.2010 | 1
3.1.2010 | 1

где: для любой ДИСТИНКТ-ДАТЫ (время без череды) мне нужна сумма ДИСТИНКТ макросписей. В 1.1.2010 ядро ​​Macro и оставленное было запущено, так что 2 ... и т.д.

Я могу сделать это с помощью представления, но я уверен, что есть более простой способ:

CREATE VIEW Days_Macros AS
SELECT DISTINCT MacroID, COUNT(MacroID) AS MacroCnt, CONVERT(varchar, tStamp, 103) AS x
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)

что дает мне:

MacroID  | MacroCnt | x
------------------------------
core     | 2        | 1.1.2010
main     | 1        | 2.1.2010
top      | 1        | 3.1.2010
left     | 1        | 1.1.2011

и чем:

SELECT DISTINCT X, COUNT(MacroCnt) AS Y FROM Test
GROUP BY X

дает мне результат. ... слишком сложно, идеи кто-нибудь?

Thanx

Ответы [ 2 ]

0 голосов
/ 05 декабря 2011

Пример данных:

if object_id('tempdb..#tab') is not null drop table #tab

create table #tab (
    id int,
    date datetime,
    macroId varchar(6),
    fynctionId varchar(10)
)

insert into #tab
select 1 , '1.1.2010 10:00', 'core', 'coreP1' union
select 2 , '2.1.2010 11:11', 'main', 'mainP7' union
select 3 , '1.1.2010 17:01', 'core', 'coreP2' union
select 4 , '3.1.2011 21:00', 'top ', 'topP7' union
select 5 , '1.1.2010 11:11', 'left', 'leftP0'

запрос (редактировать, после уточнения):

select 
    dateadd(dd, 0, datediff(dd, 0, date)) as Date, 
    count(distinct MacroId) as Sum_Macro
from #tab
group by dateadd(dd, 0, datediff(dd, 0, date))
0 голосов
/ 05 декабря 2011

Я склонен быть поклонником CTE для этой цели (с в основном встроенными представлениями).Похоже, вы используете SQL Server, поэтому вы можете сделать это:

WITH counts AS
(
    SELECT DISTINCT MacroID, COUNT(MacroID) AS MacroCnt, CONVERT(varchar, tStamp, 103) AS x
    FROM TRADStatMacro
    GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
)
SELECT DISTINCT X, COUNT(MacroCnt) AS Y FROM counts
GROUP BY X

Вопросы: вы имели в виду, что вторая COUNT() действительно будет SUM()?

Но ваш запрос может быть упрощен.Вам не нужен DISTINCT, если вы уже группируете по столбцам, которые делают запись уникальной.И вы не используете поле MacroId, кроме как в агрегатной функции COUNT(), поэтому вы можете устранить ее и, возможно, упростить все до:

SELECT CONVERT(varchar, tStamp, 103) AS X, COUNT(MacroID)
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
...