簡體   English   中英

在SQL Server中按多個參數分組

[英]Grouping by multiple parameters in SQL Server

我有一個具有以下結構的表:

id | timestamp | barcode

時間戳是一個datetime列,條形碼是完整的條形碼,我只需要前9位數字。

我需要每天每個班次的項目計數。

Day是轉換為日期的時間戳。

移位如下:

  • 班次1是從06:00:00到14:29:59
  • 班次2是從14:30:00到22:59:59
  • 班次3是從23:00:00到05:59:59

項目編號就在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.

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