【发布时间】:2014-03-20 00:10:56
【问题描述】:
为什么,我这里的 where 子句会被忽略,不管作为参数输入的值如何,它都会对发票进行求和,在这上面花了几个小时然后发疯了!
ALTER PROCEDURE [dbo].[Usp_custom_dash_metric_invoicespend]
@CompanyGUID UNIQUEIDENTIFIER,
@UserGUID UNIQUEIDENTIFIER,
@CompanyUserGUID UNIQUEIDENTIFIER,
@InvoiceYearFrom CHAR(4),
@InvoiceYearTo CHAR(4),
@CompanySupplierGUID UNIQUEIDENTIFIER
AS
BEGIN
WITH _d
AS (SELECT a.totalgrossvaluehome1 AS tgvh1,
invoicedate AS ind,
c.guid AS cug,
a.companysupplierguid AS cus,
c.userguid AS ug,
b.guid AS cg
FROM invoices a (nolock)
JOIN companies b (nolock)
ON ( a.companyguid = b.guid )
JOIN companyusers c (nolock)
ON ( c.userguid = a.createdbyguid )
WHERE a.invoicedate BETWEEN Cast(Isnull(NULL, Cast(Datepart(year
,
Dateadd(
year, -1,
Getdate()))AS NVARCHAR(
max
)))
+ '-01-01' AS DATETIME) AND
Cast(
Isnull(NULL, Cast(Datepart(year,
Getdate()
)AS
NVARCHAR(max)))
+ '-12-31' AS DATETIME)
AND c.guid = @CompanyUserGUID
OR @CompanyUserGUID IS NULL
AND a.companysupplierguid = @CompanySupplierGUID
OR @CompanySupplierGUID IS NULL
AND c.userguid = @UserGUID
OR @UserGUID IS NULL
AND a.companyguid = @CompanyGUID
OR @CompanyGUID IS NULL)
SELECT *
FROM (SELECT Year(ind) AS [ayear],
LEFT(Datename(month, ind), 3)AS [amonth],
Isnull(tgvh1, 0) AS Amount
FROM _d
WHERE cug = @CompanyUserGUID
OR @CompanyUserGUID IS NULL
AND cus = @CompanySupplierGUID
OR @CompanySupplierGUID IS NULL
AND ug = @UserGUID
OR @UserGUID IS NULL
AND cg = @CompanyGUID
OR @CompanyGUID IS NULL)s
PIVOT ( Sum(amount)
FOR [amonth] IN (jan,
feb,
mar,
apr,
may,
jun,
jul,
aug,
sep,
oct,
nov,
dec) )AS pivotal
WHERE pivotal.ayear >= Isnull(@InvoiceYearFrom, Datepart(year,
Dateadd(year, -1,
Getdate()
)))
AND pivotal.ayear <= Isnull(@InvoiceYearTo, Datepart(year, Getdate(
))
)
ORDER BY [ayear]
END
具体来说就是这个:
WHERE a.invoicedate BETWEEN Cast(Isnull(@InvoiceDateFrom, Cast(Datepart(year
,
Dateadd(
year, -1,
Getdate()))AS NVARCHAR(
max
)))
+ '-01-01' AS DATETIME) AND
Cast(
Isnull(@InvoiceDateTo, Cast(Datepart(year,
Getdate()
)AS
NVARCHAR(max)))
+ '-12-31' AS DATETIME)
AND c.guid = @CompanyUserGUID
OR @CompanyUserGUID IS NULL
AND a.companysupplierguid = @CompanySupplierGUID
OR @CompanySupplierGUID IS NULL
AND c.userguid = @UserGUID
OR @UserGUID IS NULL
AND a.companyguid = @CompanyGUID
OR @CompanyGUID IS NULL)
例如,pivot 中返回的数据是所有数据的总和(我假设因为它从 CTX 中获取数据,它将包含过滤后的数据,所以我希望如果我传入 @Userguid =(一个真实的用户 id ) 它会将旋转计数限制为仅针对用户的发票的计数...它不会:'(
【问题讨论】:
-
如果您在没有枢轴部分的情况下运行查询,您是否使用 WHERE 子句返回正确的?
-
是的,从 CTX 返回的数据过滤正确。
标签: sql sql-server tsql sql-server-2008-r2 pivot