2016-09-28 10 views
0

私は過去1ヶ月間に特定のチームによって入力されたConnectWiseタイムエントリを検索するクエリを実行しています。私がしたいのは、1つのチケットにつき1つの結果しか含まないように、以下のクエリを変更することです。datediff(s, time_start, time_end)の結果が1800を超えている場合のみ変更してください。エラーが発生したので、私のMWEだけが以下のクエリです。SQL Server:サブクエリ、ConnectWiseデータベースの結果の合計を選択します。

SELECT 
    service.SR_Service_RecID AS "Ticket #", 
    te.Date_Start AS "Time Entry Day", 
    m.first_name AS First, 
    m.last_name AS Last, 
    DATEDIFF(s, te.time_start, te.time_end) AS "Time (s)" 
FROM 
    dbo.Time_Entry te 
LEFT JOIN 
    dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID 
LEFT JOIN 
    dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID 
LEFT JOIN 
    dbo.Member m ON m.Member_RecID = te.Member_RecID 
LEFT JOIN 
    dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID 
LEFT JOIN 
    dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID 
WHERE 
    m.member_recID IN (SELECT M.Member_RecID 
         FROM Member M 
         LEFT JOIN dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID 
         LEFT JOIN dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID 
         WHERE T.Description LIKE '%c' 
          OR T.Description LIKE '%d' 
          OR T.Description LIKE '%e') 
    AND activity.Description LIKE 'T%' 
    AND service.Date_Entered >= DATEADD(MONTH, -1, GETDATE()) 
GROUP BY 
    service.SR_Service_RecID, te.Time_RecID, te.Date_Start, 
    m.first_name, m.last_name, 
    DATEDIFF(s, te.time_start, te.time_end) 
ORDER BY 
    service.SR_Service_RecID DESC 

生成する:

Ticket # Time Entry Day   First Last Time(s) 
756065  2016-09-28 00:00:00.000 Mr.  Smith 1,000 
756065  2016-09-28 00:00:00.000 Mr.  Smith 560 

私が探している:私は、サブクエリの一部にこれを作ってみた

Ticket # Time Entry Day   First Last Time(s) 
756065  2016-09-28 00:00:00.000 Mr.  Smith 1,560 

、私は私の問題は、私はトラブルの折り返しを抱えていると思います私の頭ar私が必要とする結果を得るために必要なものの論理

ご協力いただきまして誠にありがとうございます。

+1

あなたの 'group by'から' datediff(s、te.time_start、te.time_end) 'を削除し、その列の' sum'を 'select'に追加してください – techspider

答えて

1

クエリで間違っている二つのものがあります。

  1. あなたのSELECT文で集計機能を持っていませんでしたが。
  2. あなたは

ので、追加の列が得られ、あなたのgroup byTime (s)列を持って、これら二つの問題を整流以下のようにクエリを変更します。

SELECT 
    service.SR_Service_RecID AS "Ticket #", 
    te.Date_Start AS "Time Entry Day", 
    m.first_name AS First, 
    m.last_name AS Last, 
    SUM(DATEDIFF(s, te.time_start, te.time_end)) AS "Time (s)" 
FROM 
    dbo.Time_Entry te 
LEFT JOIN 
    dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID 
LEFT JOIN 
    dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID 
LEFT JOIN 
    dbo.Member m ON m.Member_RecID = te.Member_RecID 
LEFT JOIN 
    dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID 
LEFT JOIN 
    dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID 
WHERE 
    m.member_recID IN (SELECT M.Member_RecID 
         FROM Member M 
         LEFT JOIN dbo.SR_Team_Mbr member ON member.Member_RecID = M.Member_RecID 
         LEFT JOIN dbo.SR_Team T ON T.SR_Team_RecID = member.SR_Team_RecID 
         WHERE T.Description LIKE '%c' 
          OR T.Description LIKE '%d' 
          OR T.Description LIKE '%e') 
    AND activity.Description LIKE 'T%' 
    AND service.Date_Entered >= DATEADD(MONTH, -1, GETDATE()) 
GROUP BY 
    service.SR_Service_RecID, te.Date_Start, 
    m.first_name, m.last_name 
ORDER BY 
    service.SR_Service_RecID DESC 

このMSDN articleGROUP BYにあなたの完全な洞察力を与える必要があります。

+0

それは私に本当に奇妙な結果をもたらします。私はまだチケットごとに複数の行を取得していますが、Time(s)列は正しく追加されません。 – jmd9qs

+1

'group by'の他の列は必要ではないかもしれません。あなたの 'group by'から' te.Time_RecID'も削除してみてください。私はあなたがその列を必要としないと仮定して私の答えを更新しました。 – techspider

+0

ありがとうございます。チケットごとに複数の行が処理されますが、数学はこれまでよりもさらにはずれています。単一のタイムエントリだけのチケットでさえもオフになります – jmd9qs

0

問題はSR_TeamテーブルとSR_Team_Memberテーブルへの結合にあります。メンバーは複数のチームに所属することができます。メンバーが特定のチームにいるかどうかを確認しようとしているようです。

チケットごとに1つの行が必要ですが、メンバは同じ時間内にチケットごとに複数のタイムエントリを持つことができます。したがって、場合によってはチケットごとに複数の行が表示されます。

チケットの全メンバーのSUMが1800秒を超えるようにしたい場合は、DATEDIFF()をSUMにし、GROUP BYを使用し、WHERE句からDATEDIFF()を1800にする必要があります。 GROUP BYの後にHAVING句を追加します。このクエリは、あなたの任意の個々の時間を取得します

エントリ> 1800秒

SELECT 
    service.SR_Service_RecID AS "Ticket #", 
    convert(date,te.Date_Start) AS "Time Entry Day", 
    m.first_name AS First, 
    m.last_name AS Last, 
    DATEDIFF(s, te.time_start, te.time_end) AS "Time (s)" 
FROM 
    dbo.Time_Entry te 
INNER JOIN dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID 
INNER JOIN dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID 
INNER JOIN dbo.Member m ON m.Member_RecID = te.Member_RecID 
WHERE datediff(s,te.time_start, te.time_end) > 1800 
AND activity.Description like 'T%' 
AND service.Date_Entered >= dateadd(month, -1, getdate()) 
AND EXISTS (select * 
      from dbo.SR_Team_Mbr tm 
      inner join dbo.SR_Team t on tm.SR_Team_RecID = t.SR_Team_RecID and tm.Member_RecID = m.Member_RecID 
      where (t.Description like '%c' or t.Description like '%d' or t.Description like '%e')) 
ORDER BY service.SR_Service_RecID desc 

このクエリは、あなたのチケットを入手する場所チケット> 1800秒のメンバーのためのすべての時間エントリのSUM

SELECT 
    service.SR_Service_RecID AS "Ticket #", 
    convert(date,te.Date_Start) AS "Time Entry Day", 
    m.first_name AS First, 
    m.last_name AS Last, 
    SUM(DATEDIFF(s, te.time_start, te.time_end))AS "Time (s)" 
FROM 
    dbo.Time_Entry te 
INNER JOIN dbo.Activity_Class activity ON activity.Activity_Class_RecID = te.Activity_Class_RecID 
INNER JOIN dbo.SR_Service service ON te.SR_Service_RecID = service.SR_Service_RecID 
INNER JOIN dbo.Member m ON m.Member_RecID = te.Member_RecID 
WHERE activity.Description like 'T%' 
AND service.Date_Entered >= dateadd(month, -1, getdate()) 
AND EXISTS (select * 
      from dbo.SR_Team_Mbr tm 
      inner join dbo.SR_Team t on tm.SR_Team_RecID = t.SR_Team_RecID and tm.Member_RecID = m.Member_RecID 
      where (t.Description like '%c' or t.Description like '%d' or t.Description like '%e')) 
GROUP BY service.SR_Service_RecID, convert(date,te.Date_Start), m.First_Name, m.Last_Name 
HAVING SUM(DATEDIFF(s, te.time_start, te.time_end)) > 1800 
ORDER BY service.SR_Service_RecID desc 
関連する問題