Crystal Reports中嵌套的Select语句的SQL语法不正确

时间:2015-06-03 17:52:23

标签: sql-server crystal-reports crystal-reports-xi

尝试创建Crystal Report并需要从现有数据库创建自己的自定义数据集。我已经完成了所有别名,检查了各个选项是否可靠,但是当我把它们全部放在一起时,我得到了语法错误。我哪里错了? SQLexpress查询在这里:

/*Enter date from month you wish to report on: (ex Jan 2015 would be 2015-01-xx)*/
SELECT 
AvgCompRespDays.CompDaysHigh,
AvgCompRespDays.CompDaysLow,
AvgCompRespDays.RespDaysHigh,
AvgCompRespDays.RespDaysLow,
TotalWO.Total,
TotalWO.Now,
TotalWO.High,
TotalWO.Low,
NumberMetGoal.High,
NumberMetGoal.Low,
TopTenTypes.Top10
FROM
(
/*    SELECT AVG(DATEDIFF(d,"OPENDATE","CLSDDATE")*1.0) AS CompDaysNow,   AVG(DATEDIFF(d,"OPENDATE","RESPONDEDDATE")*1.0) AS RespDaysNow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Now' 
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),*/

SELECT AVG(DATEDIFF(d,"OPENDATE","CLSDDATE")*1.0) AS CompDaysHigh, AVG(DATEDIFF(d,"OPENDATE","RESPONDEDDATE")*1.0) AS RespDaysHigh
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'High - 1 Day' 
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate}) /*these next two lines specify closed tickets in the last month*/
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),

SELECT AVG(DATEDIFF(d,"OPENDATE","CLSDDATE")*1.0) AS CompDaysLow, AVG(DATEDIFF(d,"OPENDATE","RESPONDEDDATE")*1.0) AS RespDaysLow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days' 
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
) AS AvgCompRespDays,
(
SELECT COUNT("PRIORITY") AS Now
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Now'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),

SELECT COUNT("PRIORITY") AS High
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'High - 1 Day'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),

SELECT COUNT("PRIORITY") AS Low
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),

SELECT COUNT("PRIORITY") AS Total
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
) AS TotalWO,
(
SELECT COUNT("PRIORITY") AS High
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEDIFF(d,"OPENDATE","CLSDDATE") <= 1
AND "PRIORITY" = 'High - 1 Day'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}),

SELECT COUNT("PRIORITY") AS Low
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEDIFF(d,"OPENDATE","CLSDDATE") <= 3
AND "PRIORITY" = 'Low - 3 Days'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
) AS NumberMetGoal,
(
SELECT TOP 10 "TYPE",COUNT("TYPE") AS Top10
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
ORDER BY COUNT("TYPE") DESC
) AS TopTenTypes

1 个答案:

答案 0 :(得分:0)

我认为您在单个查询中尝试做太多事情;从我读到你的内容中,我试图获得单个总数据点,然后收集前10个结果。这些是不同的东西,我认为至少你需要将它们分解成单独的查询/数据集以便进入Crystal。我和Crystal一起工作已经有一段时间了,但是如果它像SSRS一样,你可以构建你的查询并将其变成存储过程或嵌入内联然后进入报告软件根据该查询创建数据集。因此,我设想您的前十名列表中有一个数据集,然后是一个数据集,其中包含您可以放置​​在任意位置的各个总点数。

首先,请将您的TOP 10查询设置为自己的数据集:

SELECT TOP 10 "TYPE",COUNT("TYPE") AS Top10
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
ORDER BY COUNT("TYPE") DESC

现在对于各个数据点,我认为查询可以作为公用表表达式(CTE)。类似的东西:

;WITH AvgCompRespDaysHigh as (
SELECT AVG(DATEDIFF(d,"OPENDATE","CLSDDATE")*1.0) AS CompDaysHigh, AVG(DATEDIFF(d,"OPENDATE","RESPONDEDDATE")*1.0) AS RespDaysHigh
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'High - 1 Day' 
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate}) /*these next two lines specify closed tickets in the last month*/
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate}))
),
AvgCompRespDaysLow as (SELECT AVG(DATEDIFF(d,"OPENDATE","CLSDDATE")*1.0) AS CompDaysLow, AVG(DATEDIFF(d,"OPENDATE","RESPONDEDDATE")*1.0) AS RespDaysLow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days' 
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
),
TotalWONow as (
SELECT COUNT("PRIORITY") AS Now
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Now'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
),
TotalWOHigh as (SELECT COUNT("PRIORITY") AS High
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'High - 1 Day'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
),
TotalWOLow as (SELECT COUNT("PRIORITY") AS Low
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
),
TotalWOTotal AS (SELECT COUNT("PRIORITY") AS Total
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
),
NumberMetGoalHigh AS (
SELECT COUNT("PRIORITY") AS High
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEDIFF(d,"OPENDATE","CLSDDATE") <= 1
AND "PRIORITY" = 'High - 1 Day'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})

),
NumberMetGoalLow AS (SELECT COUNT("PRIORITY") AS Low
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE DATEDIFF(d,"OPENDATE","CLSDDATE") <= 3
AND "PRIORITY" = 'Low - 3 Days'
AND DATEPART(m,"CLSDDATE") = DATEPART(m, {?reportingDate})
AND DATEPART(yyyy,"CLSDDATE") = DATEPART(yyyy, {?reportingDate})
)

SELECT 
AvgCompRespDaysHigh.CompDaysHigh,
AvgCompRespDaysLow.CompDaysLow,
AvgCompRespDaysHigh.RespDaysHigh,
AvgCompRespDaysLow.RespDaysLow,
TotalWOTotal.Total,
TotalWONow.Now,
TotalWOHigh.High,
TotalWOLow.Low,
NumberMetGoalHigh.High,
NumberMetGoalLow.Low
FROM AvgCompRespDaysHigh, AvgCompRespDaysLow, TotalWOTotal, TotalWONow, TotalWOHigh, TotalWOLow, NumberMetGoalHigh, NumberMetGoalLow

但对我来说,这似乎仍然很笨拙。我也不知道你在哪里得到你的字段名称并传入变量,如果这是一个Crystal Reports的话。其他一些评论提到删除双引号等。

如果您最终要查找的数据集只是一行,每个总计都有一个字段,那么为所需的每个值创建一个带有字段的@table变量可能更为简单,然后运行每个聚合查询都会根据需要更新表变量中的值。然后你可以选择退出该行,它可以节省上述CTE的一些笨拙。

相关问题