首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对group-by结果集执行count(*)

对group-by结果集执行count(*)
EN

Stack Overflow用户
提问于 2009-01-16 23:56:15
回答 5查看 14.8K关注 0票数 3

我正在尝试在存储过程中执行一个不错的SQL语句。

我研究了查看两个日期之间发生事件的天数的问题。我的例子是销售订单:对于这个月,我们有多少天的销售订单?

假设这样的设置:

代码语言:javascript
复制
CREATE TABLE  `sandbox`.`orders` (
  `year` int,
  `month` int,
  `day` int,
  `desc` varchar(255) 
) 

INSERT INTO orders (year, month, day, desc)  
VALUES (2009,1,1, 'New Years Resolution 1')
      ,(2009,1,1, 'Promise lose weight')
      ,(2009,1,2, 'Bagel')
      ,(2009,1,12, 'Coffee to go')

对于此数据内,结果应该是3,因为已经有三天的销售。我找到的最佳解决方案如下所示。

然而,创建一个临时表,计算一下然后删除它,就会看到多余的数据。这在一句话中“应该”是可能的。

有谁比我有更好的解决方案吗?

/L

代码语言:javascript
复制
SELECT [Year], [Month], [Day]
INTO #Some_Days
FROM Quarter
WHERE Start >= '2009-01-01' AND [End] < '2009-01-16'
GROUP BY [Year], [Month], [Day]

SELECT count(*) from #Some_Days
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-01-17 00:28:38

如果我误解了问题,很抱歉,但也许您可以这样做,作为一种选择:

代码语言:javascript
复制
SELECT COUNT(*) FROM
    (SELECT DISTINCT(SomeColumn)
       FROM MyTable
      WHERE Something BETWEEN 100 AND 500
      GROUP BY SomeColumn) MyTable

..。来绕过临时表的创建和处理?

票数 15
EN

Stack Overflow用户

发布于 2009-01-18 00:29:06

我可以看到两个基本的选项。一种方法是在一个子查询中对所有内容进行分组,然后计算这些不同的行(Christian Nunciato的答案)。第二种方法是组合多个字段,并计算组合后的值的不同值。

在这种情况下,下面的公式将这三个字段转换为单个日期时间。

代码语言:javascript
复制
DATEADD(YEAR, [Quarter].Year, DATEADD(MONTH, [Quarter].Month, DATEADD(DAY, [Quarter].DAY, 0), 0), 0)

因此,COUNT(DISTINCT公式)将给出您需要的答案。

代码语言:javascript
复制
SELECT
    COUNT(DISTINCT DATEADD(YEAR, [Quarter].Year, DATEADD(MONTH, [Quarter].Month, DATEADD(DAY, [Quarter].DAY, 0), 0), 0))
FROM
    Quarter
WHERE
    [Quarter].Start >= '2009-01-01'
    AND [Quarter].End < '2009-01-16'

我通常使用子查询路由,但根据您正在做的事情、索引、表的大小、公式的简单性等,这可能会更快……

Dems。

票数 3
EN

Stack Overflow用户

发布于 2009-01-16 23:59:00

这样如何:

代码语言:javascript
复制
SELECT COUNT(DISTINCT day) FROM orders 
WHERE (year, month) = (2009, 1);

实际上,我不知道TSQL是否支持元组比较,但您应该明白了。

COUNT(DISTINCT expr)是标准的SQL,应该适用于任何地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/452472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档