Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL:获取每小时的销售数据_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL:获取每小时的销售数据

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

我目前正在使用下面的代码从我的数据库中获取销售数据。它的问题是,它不会在没有销售的时间显示0。我不介意硬编码时间,但我找不到这样做的方法。所以

1.第一个问题:我如何将下面的代码转换为在以下时间内没有销售的小时显示0

2.第二个问题:我怎样才能从中得到一个有序的列表。以下代码将把9:00-10: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
是更传统的方法。