2012-12-12 79 views
1

對於此特定查詢,我看起來很高,也沒有看到它。從一個表中選擇所有記錄,並在第二個表中沒有另一個記錄的情況下返回空值

我們有兩張表;帳戶表,然後訪問表。我想要返回完整的帳戶名稱列表,並填寫相應的字段爲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 
+0

你的問題有點不清楚。你想僅顯示數據中存在的日期,還是需要顯示日期,即使它們不在數據中? – BStateham

+0

看到我的回答 [http:// stackoverflow。COM /問題/ 13831145/SQL查詢 - 複合內加入 - 和 - 外聯接] [1] [1]:http://stackoverflow.com/questions/13831145/sql-query -complex-inner-joins-and-outer-joins –

+0

不幸的是我需要所有的帳戶名稱,無論他們在訪問表中。在訪問表中的那些賬戶中,我需要他們的數據。下面的代碼是我用來生成當前數據的帳戶和訪問詳細信息,但它不會顯示尚未訪問過的帳戶。不在那裏的賬戶。 –

回答

0

請糾正我,如果我撥錯

選擇TO_CHAR(v.visitdate, 'YYYY')年,

TO_CHAR(v.visitdate, 'WW')較弱,a.accountname,v.visitaction

從一個帳戶,訪問v

其中a.accountname = v.ACCCOUNTNAME

和TO_CHAR(v.visitdate, 'WW')= TO_CHAR(SYSDATE, 'WW')

UNION ALL

選擇TO_CHAR(SYSDATE, 'YYYY')年,

TO_CHAR(SYSDATE, 'WW')弱,a.accountname, '完全'

從佔一個

其中a.accountname不是(從訪問v選擇v.ACCCOUNTNAME

其中TO_CHAR(v.visitdate, 'WW')= TO_CHAR(SYSDATE, 'WW'));

+0

非常感謝,這很好。其實這是一個近距離的事情,但這對我來說簡單些。 –

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); 

我希望幫助。

+0

看起來不錯我只是得到那些爲空的訪問,而不是那些有動作的訪問者。我會繼續努力,在這個階段我必須排隊等到明天,但我會回到你身邊。恢復了我對論壇的信心。 –

相關問題