我试图在存储过程中做一个很好的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
答案 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(*)