查询返回动态列名称的视图/存储过程

时间:2016-12-12 18:56:23

标签: c# sql-server excel

我有一个Query,它返回我需要的值,但Query中的列不是实际的数据库列或任何表的列。它们是我根据条件在Query中命名的jsut。现在我想在数据网格中显示它,并从我的.NET Web应用程序将它们导出到Excel。我确信我可以创建一个View但是当我尝试访问该列时会出现问题,因为它们不是表的实际列名?

或者我应该使用存储过程?我不确定哪个更容易和可维护。

以下是我的查询。

    SELECT
    c.AttributeValue as ProjectName
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Active' THEN c.REQUESTID END) as Active
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Awaiting IPN' THEN c.REQUESTID END) as AwaitingIPN
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Awaiting LPID' THEN c.REQUESTID END) as AwaitingLPID
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'DE review Completed' THEN c.REQUESTID END) as DEReviewCompleted
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Info complete' THEN c.REQUESTID END) as InfoComplete
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'IPN added' THEN c.REQUESTID END) as IPNAdded
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'New' THEN c.REQUESTID END) as New
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Pending DE review' THEN c.REQUESTID END) as PendingDEReview
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Pending Info' THEN c.REQUESTID END) as PendingInfo
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Pending Validation' THEN c.REQUESTID END) as PendingValidation
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue = 'Validation Completed' THEN c.REQUESTID END) as ValidationCompleted
    ,COUNT(DISTINCT CASE WHEN s.AttributeValue in('Active','Validation Completed','Awaiting IPN','Awaiting LPID','DE review Completed',
    'Info complete','IPN added','New','Pending DE review','Pending Info','Pending Validation') THEN c.REQUESTID END) as TotalRequestsPendingICLUpload
FROM
    Request t
    LEFT JOIN RequestAttributes c
    ON t.RequestID = c.RequestID
    AND c.AttributeID = 8218
    LEFT JOIN RequestAttributes s
    ON t.RequestID = s.RequestID
    AND s.AttributeID = 8265
    WHERE c.AttributeValue IS NOT NULL and c.AttributeValue <> '' AND t.ClosedDate IS NULL
GROUP BY
    c.AttributeValue

1 个答案:

答案 0 :(得分:0)

视图显示为外部资源的表。您应该没有问题直接使用视图而不是表格。

关于您的观点,您应该更改T&amp; C到内部联接。每个T值都需要一个基于WHERE子句的C值。这在功能上等同于内连接。如果将其保留为左连接,则脚本的意图更难以维护,并且可能导致编译器的查询计划效率低下。

此外,由于除了过滤C之外你没有使用T,你应该将T移动到相关的子查询中。

SELECT  ...
FROM  RequestAttributes AS c
LEFT JOIN RequestAttributes AS s
ON t.RequestID = s.RequestID
WHERE  c.AttributeValue <> '' 
    AND s.AttributeID = 8265
    AND c.AttributeID = 8218
    AND EXISTS (SELECT  1 FROM  Request AS t WHERE  t.ClosedDate IS NULL AND t.RequestID = c.RequestID)
GROUP BY c.AttributeValue;

不是将幻数硬编码到视图中,而应该考虑一个表值函数,这样你就可以通过s&amp; .c中的c属性ID。