2012-12-12 35 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

看起来不错我只是得到那些为空的访问,而不是那些有动作的访问者。我会继续努力,在这个阶段我必须排队等到明天,但我会回到你身边。恢复了我对论坛的信心。 –

相关问题