我正在尝试在存储过程中执行一个不错的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发布于 2009-01-17 00:28:38
如果我误解了问题,很抱歉,但也许您可以这样做,作为一种选择:
SELECT COUNT(*) FROM
(SELECT DISTINCT(SomeColumn)
FROM MyTable
WHERE Something BETWEEN 100 AND 500
GROUP BY SomeColumn) MyTable..。来绕过临时表的创建和处理?
发布于 2009-01-18 00:29:06
我可以看到两个基本的选项。一种方法是在一个子查询中对所有内容进行分组,然后计算这些不同的行(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'我通常使用子查询路由,但根据您正在做的事情、索引、表的大小、公式的简单性等,这可能会更快……
Dems。
发布于 2009-01-16 23:59:00
这样如何:
SELECT COUNT(DISTINCT day) FROM orders
WHERE (year, month) = (2009, 1);实际上,我不知道TSQL是否支持元组比较,但您应该明白了。
COUNT(DISTINCT expr)是标准的SQL,应该适用于任何地方。
https://stackoverflow.com/questions/452472
复制相似问题