对分组结果集执行计数(*)

时间:2009-01-16 23:56:15

标签: sql tsql

我试图在存储过程中做一个很好的SQL语句。

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

假设这个设置:

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

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

5 个答案:

答案 0 :(得分:8)

如果我误解了这个问题,请道歉,但也许你可以这样做,作为一个选择:

SELECT COUNT(*) FROM
    (SELECT DISTINCT(SomeColumn)
       FROM MyTable
      WHERE Something BETWEEN 100 AND 500
      GROUP BY SomeColumn) MyTable

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

答案 1 :(得分:2)

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

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

DATEADD(YEAR, [Quarter].Year, DATEADD(MONTH, [Quarter].Month, DATEADD(DAY, [Quarter].DAY, 0), 0), 0)

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

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'

我通常使用子查询路由,但取决于你正在做什么,索引,表的大小,公式的简单性等,这可以更快......

民主党。

答案 2 :(得分:1)

怎么样:

SELECT COUNT(DISTINCT day) FROM orders 
WHERE (year, month) = (2009, 1);

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

COUNT(DISTINCT expr)是标准SQL,应该可以在任何地方使用。

答案 3 :(得分:1)

您应该使用嵌套的Select语句。内部应该包含group by子句,而外部应该包含它。我认为“Christian Nunciato”已经帮助了你。

Select Count(1) As Quantity
From
(    
    SELECT [Year], [Month], [Day]
    INTO #Some_Days
    FROM Quarter
    WHERE Start >= '2009-01-01' AND [End] < '2009-01-16'
    GROUP BY [Year], [Month], [Day]
) AS InnerResultSet

答案 4 :(得分:0)

SELECT [Year], [Month], [Day]
FROM Quarter
WHERE Start >= '2009-01-01' AND [End] < '2009-01-16'
GROUP BY [Year], [Month], [Day]
COMPUTE COUNT(*)