TSQL:获取每小时的销售数据
我目前正在使用下面的代码从我的数据库中获取销售数据。它的问题是,它不会在没有销售的时间显示0。我不介意硬编码时间,但我找不到这样做的方法。所以 1.第一个问题:我如何将下面的代码转换为在以下时间内没有销售的小时显示0 2.第二个问题:我怎样才能从中得到一个有序的列表。以下代码将把9:00-10:00放在列表末尾,因为它不是两位数TSQL:获取每小时的销售数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我目前正在使用下面的代码从我的数据库中获取销售数据。它的问题是,它不会在没有销售的时间显示0。我不介意硬编码时间,但我找不到这样做的方法。所以 1.第一个问题:我如何将下面的代码转换为在以下时间内没有销售的小时显示0 2.第二个问题:我怎样才能从中得到一个有序的列表。以下代码将把9:00-10:00放在列表末尾,因为它不是两位数 -- HOUR BASED SALES select (CAST(DATEPART(HOUR, INSERTDATE) as varchar(255)) + ':00
-- HOUR BASED SALES
select (CAST(DATEPART(HOUR, INSERTDATE) as varchar(255)) + ':00 -' +
CAST(DATEPART(HOUR, INSERTDATE) as varchar(255)) + ':59'
) as [time],
SUM (TOTAL) as REVENUE,
COUNT (RECEIPTID) AS TOTAL_SALES,
DEPOTID
From INVOICE INV
WHERE DEPOTID IN (25) AND TRANSDATE BETWEEN '20181025' AND '20181025'
Group By cast(datepart(hour, INSERTDATE) AS VARCHAR(255)), DEPOTID
ORDER BY CAST(DATEPART(HOUR, INSERTDATE) AS VARCHAR(255))
您可以列出小时数并使用
左键联接
:
select (cast(v.hh as varchar(255)) + ':00 -' +
cast(v.hh as varchar(255)) + ':59'
) as [time],
sum(TOTAL) as REVENUE,
sum(RECEIPTID) AS TOTAL_SALES,
depot
From (values (0), (1), . . . (23)
) v(hh) left join
invoice i
on datepart(hour, i.insertdate) = v.hh and
i.depotid in (25) and
i.transdate between '20181025' and '20181025'
group by v.hh, DEPOTID
order by v.hh
您可以列出小时数并使用
左键联接
:
select (cast(v.hh as varchar(255)) + ':00 -' +
cast(v.hh as varchar(255)) + ':59'
) as [time],
sum(TOTAL) as REVENUE,
sum(RECEIPTID) AS TOTAL_SALES,
depot
From (values (0), (1), . . . (23)
) v(hh) left join
invoice i
on datepart(hour, i.insertdate) = v.hh and
i.depotid in (25) and
i.transdate between '20181025' and '20181025'
group by v.hh, DEPOTID
order by v.hh
谢谢除了v.insertdate不是唯一的insertdate之外,它工作得很好!。你能告诉我KeithL对“外部应用”的看法吗?@KemalEmin。您可以使用
outer apply
而不是left join
。但是,left join
是更传统的方法。谢谢。除了v.insertdate不是唯一的insertdate之外,它工作得很好!。你能告诉我KeithL对“外部应用”的看法吗?@KemalEmin。您可以使用outer apply
而不是left join
。然而,left join
是更传统的方法。