3

SSMS (SQL Server Management Studio) の使用 - 2012

この SQL クエリの作成を完了するのを手伝ってください。

最初のテーブルSites

 Client,Market,Project,SiteNumber
  grum , lad  , aaa   , 12345
  gla  , daa  , h11   , 56789

セカンドテーブルSitesStatus

SiteNumber,StatusName,Date(DateTime),ByUser
12345   ,  sta1    , 8/7/13 15:33:22, hec
12345   ,  sta1    , 8/7/13 15:43:22, hec
12345   ,  sta2    , 8/7/13 15:53:22, hec
12345   ,  sta2    , 8/7/13 16:03:22, hec
12345   ,  sta2    , 8/7/13 16:13:22, hec
56789   ,  sta1    , 8/7/13 15:22:22, hec
56789   ,  sta2    , 8/7/13 15:32:22, hec

望ましい結果

Client,Market,Project,TotalSites,   sta1   ,TotStatTime,    sta2   ,TotStat2Time,ByUser
 Grum ,  lad ,  aaa  ,     5    ,     2    ,     10    ,     3     ,     20     , hec
 gla  , daa  ,  h11  ,     2    ,     1    , inprogress,     1     , inprogress , hec

sitenumberテーブル 1の日付に対応するテーブル 2 の日付列のすべての行の時間を表示する必要がinprogressありますが、計算する数値が見つからない場合は、結果の列/行にも を配置する必要があります。(これが不可能な場合は、コードでこれを行うこともできます。)また、出勤時間はあるが退勤時間がない場合のように、値はあるが「最後の値」がまだない場合があります。

すべてのステータスは既知であり、変更されないことに注意してください。(したがって、この例では X が 2 である X の量のステータスしかないことがわかっています。)

私がこれまでに試したこと:

select 
  Client,
  Market,
  ProjectType,
  count(*) as Total,
  sum(case when StatusName = 'sta1' then 1 else 0 end) as 'sta1',
  sum(case when StatusName = 'sta2' then 1 else 0 end) as 'sta2'

--Here is where I'd like to add the Time adding for the joined table2

from
  Sites s
INNER JOIN SitesStatus ss
on s.sitenumber = ss.SiteNumber

where
  (StatusName in (
  'sta1', 
  'sta2', 
  ) 
  )
group by
  Client,
  Market,
  ProjectType

@アンディM編集:

私が言うところ-ここで、上記の結合されたテーブル2に追加する時間を追加したい場所です。サイト番号とステータスの一致を指定して、列の日付(DateTime)のすべての行を追加するロジックを知りたいです

したがって、12345 には 2 つの sta1 エントリがあり、 1つは開始エントリ、 2は加算/減算して最初のエントリから時間を取得する

12345 には 3 つの sta2 エントリもあり、時間を取得するために最初のエントリから最後のエントリを加算/減算します。

56789 には 1 つの sta1 と 1 つの sta2 があります。終了値がないため、コードに (--) または (inProgress) を表示したいと思います....

もうクリア?

4

2 に答える 2

2

最も基本的な形式で、クエリを修正して必要な追加のデータ ビットを返す 1 つの方法は次のとおりです。

select 
  s.Client,
  s.Market,
  s.ProjectType,
  count(*) as Total,
  sum(case when ss.StatusName = 'sta1' then 1 else 0 end) as sta1,
  sum(case when ss.StatusName = 'sta2' then 1 else 0 end) as sta2,
  datediff(
    minute,
    min(case ss.StatusName when 'sta1' then ss.Date end),
    max(case ss.StatusName when 'sta1' then ss.Date end)
  ) as TotSta1Time,
  datediff(
    minute,
    min(case ss.StatusName when 'sta2' then ss.Date end),
    max(case ss.StatusName when 'sta2' then ss.Date end)
  ) as TotSta2Time

from
  Sites s
INNER JOIN SitesStatus ss
on s.sitenumber = ss.SiteNumber

where (
  StatusName in (
    'sta1', 
    'sta2', 
  ) 
)
group by
  Client,
  Market,
  ProjectType
;

1 行のみを含むグループの場合、min()との両方max()が同じ値を返し、結果としてdatediff()0 と評価されます。0 を に変更すること'inprogress'は可能ですが、同じ列に異なる型が混在することになることに注意してください。代わりに NULL のみを返すことを検討し、それらをアプリケーションのように解釈することをinprogressお勧めします。そのためには、 sdatediff内に呼び出しを配置するだけで済みます。nullif()

...
  nullif(
    datediff(
      minute,
      min(case ss.StatusName when 'sta1' then ss.Date end),
      max(case ss.StatusName when 'sta1' then ss.Date end)
    ),
    0
  ) as TotSta1Time,
  nullif(
    datediff(
      minute,
      min(case ss.StatusName when 'sta2' then ss.Date end),
      max(case ss.StatusName when 'sta2' then ss.Date end)
    ),
    0
  ) as TotSta2Time
...

ただし、Desired Results のように、表示可能な結果を​​返すクエリが絶対に必要な場合は、2 つの新しい式のそれぞれにさらに 2 つの関数呼び出しを追加する必要がCASTありCONVERTますvarcharISNULL/ COALESCENULL をデフォルトにするには'inprogress':

...
  coalesce(
    convert(
      varchar(10),
      nullif(
        datediff(
          minute,
          min(case ss.StatusName when 'sta1' then ss.Date end),
          max(case ss.StatusName when 'sta1' then ss.Date end)
        ),
        0
      )
    ),
    'inprogress'
  ) as TotSta1Time,
  coalesce(
    convert(
      varchar(10),
      nullif(
        datediff(
          minute,
          min(case ss.StatusName when 'sta2' then ss.Date end),
          max(case ss.StatusName when 'sta2' then ss.Date end)
        ),
        0
      )
    ),
    'inprogress'
  ) as TotSta2Time
...
于 2013-08-09T19:10:25.133 に答える
0

元のクエリの 1 つ以上のフィールドが列見出しに変換され、ピボットされた結果が概要情報になる PIVOT 操作の後でしょうか。開始するためのリンクを次に示し ます。

于 2013-08-09T01:43:27.123 に答える