[英]Grouping by multiple parameters in SQL Server
我有一個具有以下結構的表:
id | timestamp | barcode
時間戳是一個datetime
列,條形碼是完整的條形碼,我只需要前9位數字。
我需要每天每個班次的項目計數。
Day是轉換為日期的時間戳。
移位如下:
項目編號就在left(barcode, 9)
。
基本上我需要一個結果為:
date | shift | item_number | count
-----------+-------+-------------+------
21.02.2019 | 1 | 298193879 | 32
我設法按日期和項目編號將它們分組,如下所示,但未返回期望的結果。
select
cast([timestamp] as date), left(barcode, 9) as itemnumber, count(*)
from
tablename
group by
cast([timestamp] as date), left(barcode, 9)
這基本上是具有一堆計算列的聚合。 這是一種方法:
select cast(timestamp as date) as date,
(case when convert(time, timestamp) >= '06:00:00' and
convert(time, timestamp) < '14:30:00'
then 1
when convert(time, timestamp) >= '14:30:00' and
convert(time, timestamp) < '23:00:00'
then 2
else 3
end) as shift,
left(barcode, 9) as item_number,
count(*)
from t
group by cast(timestamp as date),
(case when convert(time, timestamp) >= '06:00:00' and
convert(time, timestamp) < '14:30:00'
then 1
when convert(time, timestamp) >= '14:30:00' and
convert(time, timestamp) < '23:00:00'
then 2
else 3
end),
left(barcode, 9)
order by date, shift, item_number;
如果使用cross apply
來定義變量,則編寫起來更簡單(並且更不容易出錯):
select v.date, v.shift, v.item_number,
count(*)
from t cross apply
(values (cast(timestamp as date),
(case when convert(time, timestamp) >= '06:00:00' and
convert(time, timestamp) < '14:30:00'
then 1
when convert(time, timestamp) >= '14:30:00' and
convert(time, timestamp) < '23:00:00'
then 2
else 3
end),
left(barcode, 9)
)
) v(date, shift, item_number)
group v.date, v.shift, v.item_number
order by date, shift, item_number
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.