ฉันต้องการแสดงรายการขายทั้งหมดและจัดกลุ่มผลรวมตามวัน
Sales (saleID INT, amount INT, created DATETIME)
หมายเหตุ: ฉันใช้ SQL Server 2005
ฉันต้องการแสดงรายการขายทั้งหมดและจัดกลุ่มผลรวมตามวัน
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)
สำหรับ Oracle:
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
ช่องที่คำนวณเหล่านั้นจะได้รับการอัปเดตอยู่เสมอ (เมื่อวันที่ "สร้าง" ของคุณเปลี่ยนแปลง) ซึ่งเป็นส่วนหนึ่งของตารางของคุณสามารถใช้งานได้เช่นเดียวกับฟิลด์ทั่วไปและยังสามารถจัดทำดัชนีได้ (หาก "ถูกสร้าง" ) - คุณสมบัติที่ยอดเยี่ยมที่ IMHO ใช้น้อยมาก
มาร์ค
สำหรับ Oracle คุณสามารถทำได้
group by trunc(created);
เนื่องจากจะตัดวันที่และเวลาที่สร้างไว้ให้เหลือเที่ยงคืนก่อนหน้า
อีกทางเลือกหนึ่งคือ
group by to_char(created, 'DD.MM.YYYY');
ซึ่งได้ผลลัพธ์เดียวกัน แต่อาจช้ากว่าเนื่องจากต้องมีการแปลงประเภท
สำหรับ PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
หรือใช้นักแสดง:
GROUP BY timestampfield::date
หากคุณต้องการความเร็วให้ใช้ตัวเลือกที่สองและเพิ่มดัชนี:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
ใช้ 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)
}