[英]SUM on a Column Group
我有三個結構類似的表
tasktime - starttime,endtime,packagedetailid,packageid
packagedetailid - packageid,productid, etc
productime - productid and searchesperday
我在這些上使用的查詢如下
SELECT CONVERT(varchar, t.StartTime, 111) AS 'Date'
, SUM(DATEDIFF(second, t.StartTime, t.EndTime)) / 60 AS DailyMinutes
, COUNT(DISTINCT p.PackageDetailID) AS OrderCount
, LEFT(CAST(SUM(DATEDIFF(minute, t.StartTime, t.EndTime))
/ (COUNT(DISTINCT p.PackageDetailID) + 0.0000001) AS varchar), 4) AS PerOrder
, LEFT(CAST((COUNT(DISTINCT p.PackageDetailID) * 100)
/ (e.SearchesPerDay + 0.00000001) AS varchar), 4) AS WeightedOrderCount
FROM ProductTime AS e INNER JOIN dbo.PackageDetails AS p
WITH (NOLOCK) ON e.ProductID = p.ProductID INNER JOIN
TaskTime AS t WITH (NOLOCK) ON p.PackageDetailID = t.PackageDetailId
WHERE(t.EndTime IS NOT NULL)
AND (DATEDIFF(hour, t.StartTime, t.EndTime) < 1)
AND (DATEDIFF(second, t.StartTime, t.EndTime) > 0)
AND (t.UserId = '12345')
AND (t.StartTime BETWEEN '1/1/2010'
AND '9/13/2010')
GROUP BY CONVERT(varchar, t.StartTime, 111), e.SearchesPerDay
ORDER BY CONVERT(varchar, t.StartTime, 111)
OUTPUT是:
**date dailyminutes ordercount perorder weightordercount**
2010/01/04 104 26 4.03 43.30
2010/01/04 10 1 9.99 1.24
2010/01/04 19 8 2.37 8.88
2010/01/04 22 11 1.99 10.90
2010/01/04 18 5 3.59 2.77
2010/01/05 49 17 2.99 28.30
2010/01/05 31 5 6.39 5.55
2010/01/05 26 6 4.33 5.99
2010/01/05 8 4 1.99 3.33
但是我希望將"Weightordercount"
與日期"Weightordercount"
以便輸出
**date dailyminutes ordercount perorder weightordercount**
2010/01/04 173 51 21.97 67.09
2010/01/05 114 32 15.70 43.17
我不是一個SQL專家,如果可以通過單個SQL命令或通過Strored過程實現這一點,則需要您的幫助
提前致謝
您的代碼在您的帖子中格式可怕,所以我將給您一個通用答案:
您需要使用GROUP BY
子句,然后對每個聚合進行SUM
。
所以像這樣:
select date, sum(dailyminutes), sum(ordercount), sum(perorder), sum(weightordercount)
from (yourentirequery) a
group by date
order by date asc
(1) 不要在沒有長度的情況下使用varchar - 但是為什么要轉換為varchar呢?
(2)為什么每天按搜索進行分組? 我猜這需要是一個有意義的SUM,這是我將如何做到這一點:
;WITH x AS
(
SELECT
[Date] = DATEDIFF(DAY, '19000101', t.StartTime),
DailyMinutes = SUM(DATEDIFF(SECOND, t.StartTime, t.EndTime)),
OrderCount = COUNT(DISTINCT p.PackageDetailID),
SearchesPerDay = SUM(e.SearchesPerDay)
FROM
dbo.ProductTime AS e
INNER JOIN
dbo.PackageDetails AS p
ON e.ProductID = p.ProductID
INNER JOIN
dbo.TaskTime AS t
ON p.PackageDetailID = t.PackageDetailID
WHERE
t.EndTime IS NOT NULL
AND (DATEDIFF(SECOND, t.StartTime, t.EndTime) BETWEEN 1 AND 3599)
AND (t.UserId = '12345')
AND (t.StartTime >= '20100101' AND t.StartTime <= '20100913')
GROUP BY
DATEDIFF(DAY, '19000101', t.StartTime)
)
SELECT
[Date] = DATEADD(DAY, [Date], '19000101'),
DailyMinutes,
OrderCount,
PerOrder = CONVERT(DECIMAL(10,2), (DailyMinutes * 1.0 / OrderCount)),
WeightedOrderCount = CONVERT(DECIMAL(10,2), (100.0 * OrderCount / SearchesPerDay))
FROM
x
ORDER BY
[Date];
其他幾項增強功能:
(a)不要使用BETWEEN作為日期/時間,使用> =和<(我把結尾留作<=但你可能意味着<9/14或<9/13)。
(b)不使用區域格式的日期 - '09 / 13/2010'不是有效日期,具體取決於語言,日期格式或區域設置。 'YYYYMMDD'是SQL Server中僅用於日期的最安全格式。
(c)嘗試盡可能少地進行計算 - 我將重復計算移動到CTE中,以便其他計算中的參考可以更簡單。 您不需要CTE,也可以使用子查詢。 這也是我將兩個檢查與StartTime和EndTime之間的增量相結合的原因。
(d)獲取小數的方法相當粗糙 - 添加小數位,轉換為字符串,左邊...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.