4

検索してみましたが、答えが見つからないため、間違ったキーワードを使用している可能性があります。

2 つの日付の間で従業員ごとに開いている注文の数を見つけようとしています。従業員のリストを表示するテーブルが 1 つあります。別のテーブルには、開始日と終了日、および日付テーブルが含まれている注文のリストが表示されます。

結合された従業員テーブルと注文テーブルは、次のようなものを返します。

employee    order ref   opened          closed
a           123         01/01/2012      04/01/2012
b           124         02/01/2012      03/01/2012
a           125         02/01/2012      03/01/2012

そして、このデータを次のように変換する必要があります。

Date            employee    Count
01/01/2012      a           1
02/01/2012      a           2
02/01/2012      b           1
03/01/2012      a           2
03/01/2012      b           1
04/01/2012      a           1

SQL サーバーからデータを取得しています。

何か案は?

ありがとう

ニック

4

4 に答える 4

3

Datesの間の結合の結果に結合し、次のように日付と従業員でグループ化してカウントを取得します。EmployeesOrders

SELECT
  d.Date,
  o.Employee,
  COUNT(*) AS count
FROM Employees e
  INNER JOIN Orders o ON e.ID = o.Employee
  INNER JOIN Dates d ON d.Date BETWEEN o.Opened AND o.Closed
GROUP BY
  d.Date,
  o.Employee
于 2012-06-27T05:02:09.687 に答える
1

これを行う私のお気に入りの方法は、時間の経過とともに累積開封数と累積クローズ数をカウントすることです。

with cumopens as
    (select employee, opened as thedate,
            row_number() over (partition by employee order by opened) as cumopens,
            0 as cumcloses
     from eo
    ),
     cumcloses as
    (select employee, closed as thedate, 0 as cumopens,
            row_number() over (partition by employee order by closed ) as cumcloses
     from eo
    )
select employee, c.thedate, max(cumopens), max(cumcloses),
       max(cumopens) - max(cumcloses) as stillopened
from ((select *
       from cumopens
      ) union all
      (select *
       from cumcloses
      )
     ) c
group by employee, thedate

このアプローチの唯一の問題は、従業員の活動がある日付のみが報告されることです。これはあなたの場合に機能します。

より一般的なソリューションでは、日付を生成するためにシーケンス番号が必要です。このために、十分な行を持つ既存のテーブルからテーブルを作成することがよくあります。

with nums as
    (select row_number() over (partition by null order by null) as seqnum
     from employees
    )
select employee, dateadd(day, opened, seqnum) as thedate, count(*)
from eo join
     nums
     on datediff(day, opened, closed) < seqnum
group by employee, dateadd(day, opened, seqnum)
order by 1, 2
于 2012-06-26T14:50:00.253 に答える
0

実際には行番号のように見えるため、結果の列数を呼び出すのは少し奇妙でした。これは、ROW_NUMBER を使用して行うことができます。

もう 1 つの興味深い点は、開始日と終了日を別々の行にする必要があることです。単純な UNION を使用すると、それが解決されます。

WITH cte 
     AS (SELECT Row_number() OVER ( PARTITION BY employee  
                                    ORDER BY order_ref) count, 
                employee, 
                opened, 
                closed 
         FROM   orders) 
SELECT employee,  opened date,  count 
FROM   cte 
UNION ALL 
SELECT employee,  closed date,  count 
FROM   cte 
ORDER  BY Date, 
          employee 

デモ

于 2012-06-26T14:46:50.467 に答える
0
SELECT opened,employee,count(*)
FROM employee LEFT JOIN orders
WHERE opened < firstDate and opened > secondDate
GROUP BY opened,employee

または、最初の条件を変更できます

WHERE opened BETWEEN firstDate and secondDate
于 2012-06-26T14:27:35.467 に答える