用子查询替换视图

发布于 2024-12-19 10:01:10 字数 1150 浏览 1 评论 0原文

我有一个包含以下数据的表:

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

其中: 对于任何 DISTINCT 日期(剥离时间),我需要 DISTINCT 宏出现次数的总和。 在 2010 年 1 月 1 日,宏核心和左侧运行,因此 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

给我结果。 ...太复杂了,有人有想法吗?

谢谢

I have a table with this data:

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

and I need to get:

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

where:
for any DISTINCT Date (stripped time) I need a sum of DISTINCT Macro occurrences.
At 1.1.2010 the Macro core and left was run, so 2... etc

I can do this using a view, but I'm sure there is more easy way:

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)

which gives me:

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

and than:

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

gives me the result.
...too complicated, ideas anybody?

Thanx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤独患者 2024-12-26 10:01:10

示例数据:

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))

Sample data:

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'

query (edit, after clarification):

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))
远昼 2024-12-26 10:01:10

为此,我倾向于使用 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。除了聚合 COUNT() 函数之外,您没有使用 MacroId 字段,因此您可以消除它,并可能将所有内容简化为:

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

I tend to be a fan of CTEs for this purpose (with are basically inline views). It looks like you're using SQL Server, so you could do this:

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

Questions: did you mean for the second COUNT() to actually be a SUM()?

But your query could be simplified. You don't need the DISTINCT if you're already grouping by the columns that make the record unique. And you aren't using the MacroId field other than in the aggregate COUNT() function, so you could eliminate it and probably simplify everything down to:

SELECT CONVERT(varchar, tStamp, 103) AS X, COUNT(MacroID)
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文