繁体   English   中英

Crystal Reports中带有嵌套Select语句的错误SQL语法不正确

[英]Incorrect SQL Syntax with nested Select statements in Crystal Reports

尝试创建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

我认为您正在尝试在单个查询中做太多事情; 从我正在阅读的内容中,您正在尝试获得单个总数据点,然后再获取前10个结果的集合。 这些是不同的事情,我认为至少您需要将它们分解为单独的查询/数据集,以提取到Crystal中。 自从我使用Crystal以来已经有一段时间了,但是如果它类似于SSRS,则可以构建查询,然后将其放入存储的proc或将其内联,然后在报表软件中从该查询创建数据集。 因此,我设想您有一个用于前10位列表的数据集,然后是一个包含各个总点的数据集,您可以将其放置在任何位置。

因此,首先进行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的一些笨拙之处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM