Sql server 将日期与日期时间戳分开,然后按日期总计显示

Sql server 将日期与日期时间戳分开,然后按日期总计显示,sql-server,Sql Server,我对SQL非常陌生,更确切地说,我已经8年左右没有使用过它了。这是在使用SQL Server的餐厅销售点系统中完成的。无论如何,这是我目前的代码: select cashier_id,grand_total, num_people_party, datetime from invoice_totals where datetime >= '2012-06-01' 最后,我想显示一个报告,列出每个日期的总服务人数(num\u-people\u-served)和总服务人数(grand\u-t

我对SQL非常陌生,更确切地说,我已经8年左右没有使用过它了。这是在使用SQL Server的餐厅销售点系统中完成的。无论如何,这是我目前的代码:

select cashier_id,grand_total, num_people_party, datetime
from invoice_totals
where datetime >= '2012-06-01'
最后,我想显示一个报告,列出每个日期的总服务人数(
num\u-people\u-served
)和总服务人数(
grand\u-total
),按出纳id(
cashier\u-id
)列出

因此:

这应该不会太难,但我只是不记得了,我的搜索也没有被证明有用。此外,还应注意,
DateTime
字段需要拆分,以便按日期对总计进行分组


从下面的注释中添加dividon字段时,添加后会出现以下错误:

Message: Could not retrieve datatable.
SELECT CASHIER_ID AS SERVER, CONVERT(VARCHAR(10),[DATETIME],111) AS DATE, SUM(GRAND_TOTAL) AS TOTAL_SALES, SUM(NUM_PEOPLE_PARTY) AS NUMBER_SERVED, SUM(GRAND_TOTAL) / SUM(NUM_PEOPLE_PARTY) AS CASHPERCUSTOMER
FROM INVOICE_TOTALS
WHERE [DATETIME] >= '2012-06-01'
GROUP BY CASHIER_ID, CONVERT(VARCHAR(10),[DATETIME],111) 
Stack Trace:    at PCA_DataMod.PCA_DB.OpenDT(String SQLLoadInfo, Boolean NoSchema)
   at PCA_DataMod.PCA_DB.OpenDT(String SQLLoadInfo)
   at pcAmerica.Desktop.POS.Forms.frmReportCustomWiz.GetRawSQLFields()
   at pcAmerica.Desktop.POS.Forms.frmReportCustomWiz.Display_Step(WizardStep Index)

Message: Divide by zero error encountered.
Stack Trace:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
   at PCA_DataMod.PCA_DB.OpenDT(String SQLLoadInfo, Boolean NoSchema)

有什么想法吗?

你可以按出纳和日期分组:

select     cashier_id
,          dateadd(d, 0, datediff(d, 0, [datetime]))
,          sum(grand_total)
,          sum(num_people_party)
from       invoice_totals
where      [datetime] >= '2012-06-01'
group by
           cashier_id
,          dateadd(d, 0, datediff(d, 0, [datetime]))
在SQL Server 2008及更高版本中,可以替换

dateadd(d, 0, datediff(d, 0, [datetime]))


您可以按日期部分进行分组:

select cashier_id,SUM(grand_total), SUM(num_people_party), DATEPART(dd,[datetime]) AS Day, DATEPART(mm,[datetime]) AS Month, DATEPART(yyyy,[datetime]) AS Year
from invoice_totals
where datetime >= '2012-06-01'
group by cashier_id, DATEPART(dd,[datetime]), DATEPART(mm,[datetime]), DATEPART(yyyy,[datetime])
或者更简单地说

select cashier_id, SUM(grand_total), SUM(num_people_party), DAY([datetime]) AS Day, MONTH([datetime]) AS Month, YEAR([datetime]) AS Year
from invoice_totals
where datetime >= '2012-06-01'
group by cashier_id, DAY([datetime]), MONTH([datetime]), YEAR([datetime])

可能的重复似乎效果很好,有几个后续问题:-如何更改报告中列的名称,它当前显示为出纳ID,第1列,第2列,第3列-有没有办法从显示中省略时间,它当前显示日期,然后是每条记录的12:00:00 AM时间-如何再添加一列,将总计除以每条记录的服务人数?1,在末尾添加
作为别名
,如
sum(grand_total)作为总计
。2.将
dateadd(d,0,datediff(d,0,[datetime]))
替换为
convert(varchar(10),[datetime],111)
3
sum(总计)/sum(人数/人数/聚会)作为CashPerCustomer
3个中的2个工作得很好!然而,分割线似乎抛出了一个错误。我更新了原始问题以显示抛出的错误消息。我真的很感谢你的帮助!有一个被零除的错误,我添加了一个case语句来处理它。再次感谢您的帮助,感谢您抽出时间!
select cashier_id,SUM(grand_total), SUM(num_people_party), DATEPART(dd,[datetime]) AS Day, DATEPART(mm,[datetime]) AS Month, DATEPART(yyyy,[datetime]) AS Year
from invoice_totals
where datetime >= '2012-06-01'
group by cashier_id, DATEPART(dd,[datetime]), DATEPART(mm,[datetime]), DATEPART(yyyy,[datetime])
select cashier_id, SUM(grand_total), SUM(num_people_party), DAY([datetime]) AS Day, MONTH([datetime]) AS Month, YEAR([datetime]) AS Year
from invoice_totals
where datetime >= '2012-06-01'
group by cashier_id, DAY([datetime]), MONTH([datetime]), YEAR([datetime])