簡體   English   中英

SQL 查詢按天分組

[英]SQL query to group by day

我想列出所有銷售額,並按天對總和進行分組。

Sales (saleID INT, amount INT, created DATETIME)

注意:我使用的是 SQL Server 2005。

如果您使用的是 SQL Server,

dateadd(DAY,0, datediff(day,0, created))將返回創建的日期

例如,如果銷售創建於 '2009-11-02 06:12:55.000',則dateadd(DAY,0, datediff(day,0, created))返回 '​​2009-11-02 00:00:00.000'

select sum(amount) as total, dateadd(DAY,0, datediff(day,0, created)) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))

對於 SQL Server:

GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)

或更快(來自 Q8-Coder):

GROUP BY dateadd(DAY,0, datediff(day,0, created))

對於 MySQL:

GROUP BY year(datefield), month(datefield), day(datefield)

或更好(來自 Jon Bright):

GROUP BY date(datefield)

對於甲骨文:

GROUP BY to_char(datefield, 'yyyy-mm-dd')

或更快(來自 IronGoofy):

GROUP BY trunc(created);

對於 Informix(由 Jonathan Leffler):

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)

如果您使用的是 MySQL:

SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate

如果您使用的是 MS SQL 2008:

SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date)

實際上,這取決於您使用的是什么 DBMS,但在常規 SQL convert(varchar,DateColumn,101)會將 DATETIME 格式更改為日期(一天)

所以:

SELECT 
    sum(amount) 
FROM 
    sales 
GROUP BY 
    convert(varchar,created,101)

magix 數字101是它轉換成的日期格式

如果您使用的是 SQL Server,則可以向表中添加三個計算字段:

Sales (saleID INT, amount INT, created DATETIME)

ALTER TABLE dbo.Sales
  ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
  ADD SaleDay AS DAY(Created) PERSISTED

現在您可以按銷售的日期、月份或年份輕松分組、訂購等:

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay

這些計算字段將始終保持最新(當您的“創建”日期更改時),它們是您的表的一部分,它們可以像常規字段一樣使用,甚至可以編入索引(如果它們是“PERSISTED”) ) - 很棒的功能,完全沒有得到充分利用,恕我直言。

馬克

對於 PostgreSQL:

GROUP BY to_char(timestampfield, 'yyyy-mm-dd')

或使用演員表:

GROUP BY timestampfield::date

如果您想要速度,請使用第二個選項並添加索引:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));

對於oracle,您可以

group by trunc(created);

因為這會將創建的日期時間截斷到前一個午夜。

另一種選擇是

group by to_char(created, 'DD.MM.YYYY');

實現相同的結果,但可能會更慢,因為它需要類型轉換。

MySQL 最簡單直觀的解決方案是:

GROUP BY day(datefield)

使用 linq

from c in Customers
group c by DbFunctions.TruncateTime(c.CreateTime) into date
orderby date.Key descending
select new  
{
    Value = date.Count().ToString(),
    Name = date.Key.ToString().Substring(0, 10)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM