1

この特定のクエリの高低を調べましたが、見たことがありません。

2 つのテーブルがあります。Accounts テーブル、次に Visit テーブル。アカウント名の完全なリストを返し、対応するフィールドに null または正しい年などを入力したいと考えています。このデータは、SSRS のマトリックス レポートで使用されます。

サンプル:

Acounts:
AccountName  AccountGroup  Location
Brown Jug    Brown Group   Auckland
Top Shop     Top Group     Wellington
Super Shop   Super Group   Christchurch

Visit:
AcccountName  VisitDate   VisitAction
Brown Jug     12/12/2012  complete
Super Shop    1/10/2012   complete

毎週の訪問を選択し、完全に訪問したアカウントを表示してから、訪問していないアカウントを表示する必要があります。

e.g.
Year  Week  AccountName  VisitStatus       for week 10/12/2012 should show
2012    50  Brown Jug    complete
2012    50  Top Group    not complete
2012    50  Super Shop   not complete

e.g.
Year  Week  AccountName  VisitStatus      for week 1/10/2012 should show
2012     2  Brown Jug    not complete
2012     2  Top Group    not complete
2012     2  Super Shop   complete
4

2 に答える 2

0

次の回答は、

A)その週にアカウントが訪問されたかどうかにかかわらず、特定の範囲内で毎週表示したい。
B) 毎週すべてのアカウントを表示したい
C) 特定の週に訪問されたアカウントについて、実際の VisitAction を表示します。
D) 特定の週に訪問されなかったアカウントについては、VisitAction として「完了していません」と表示します。

これらすべてが当てはまる場合、次のクエリは必要なことを実行できます。ここで遊ぶことができる機能する sqlfiddle の例があります: http://sqlfiddle.com/#!3/4aac0/7

--First, get all the dates in the current year.
--This uses a Recursive CTE to generate a date 
--for each week between a start date and an end date
--In SSRS you could create report parameters to replace
--these values.
WITH WeekDates AS
(
  SELECT CAST('1/1/2012' AS DateTime) AS WeekDate
  UNION ALL
  SELECT DATEADD(WEEK,1,WeekDate) AS WeekDate
  FROM WeekDates
  WHERE DATEADD(WEEK,1,WeekDate) <= CAST('12/31/2012' AS DateTime)
),
--Next, add meta data to the weeks from above. 
--Get the WeekYear and WeekNumber for each week.
--Note, you could skip this as a separate query 
--and just included these in the next query, 
--I've included it this way for clarity
Weeks AS
(
  SELECT
    WeekDate,
    DATEPART(Year,WeekDate) AS WeekYear,
    DATEPART(WEEK,WeekDate) AS WeekNumber
  FROM WeekDates
), 
--Cross join the weeks data from above with the
--Accounts table.  This will make sure that we 
--get a row for each account for each week.  
--Be aware, this will be a large result set 
--if there are a lot of weeks & accounts (weeks * account)
AccountWeeks AS 
(
  SELECT 
    * 
  FROM Weeks AS W
  CROSS JOIN Accounts AS A
)
--Finally LEFT JOIN the AccountWeek data from above
--to the Visits table.  This will ensure that we 
--see each account/week, and we'll get nulls for 
--the visit data for any accounts that were not visited
--in a given week.
SELECT 
  A.WeekYear,
  A.WeekNumber,
  A.AccountName,
  A.AccountGroup,
  IsNull(V.VisitAction,'not complete') AS VisitAction
FROM AccountWeeks AS A
LEFT JOIN Visits AS V
ON A.AccountName = V.AccountName
AND A.WeekNumber = DATEPART(WEEK,V.VisitDate)
--Set the maxrecursion number to a number 
--larger than the number of weeks you will return
OPTION (MAXRECURSION 200);

それが役立つことを願っています。

于 2012-12-12T02:45:22.827 に答える
0

着用している場合は修正してください

to_char(v.visitdate,'YYYY') 年を選択し、

to_char(v.visitdate,'WW') WEAK,a.accountname,v.visitaction

アカウント a から、v にアクセス

どこで a.accountname=v.ACCCOUNTNAME

そして to_char(v.visitdate,'WW')=to_char(sysdate,'WW')

ユニオンオール

to_char(sysdate,'YYYY') 年を選択し、

to_char(sysdate,'WW') WEAK,a.accountname,'In Complete'

アカウントから

a.accountname が含まれていない場合 ( v.ACCCOUNTNAME を選択

from 訪問 v where to_char(v.visitdate,'WW')=to_char(sysdate,'WW'));

于 2012-12-12T03:34:28.610 に答える