【问题标题】:View/Stored procedure for query returning dynamic column Names查询返回动态列名称的视图/存储过程
【发布时间】:2016-12-12 18:56:23
【问题描述】:

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

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

下面是我的查询。

    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

【问题讨论】:

  • 您正在分配列别名,这是您将在查询中使用的。即select AwaitingIPN from myView 除非您要传递不同的请求和属性 ID,否则我不明白您为什么要在此处查看视图。
  • 是的,这就是我在数据库中创建视图的原因,但我想确认这是否是正确的方法。那么在我的术语模型中,我可以直接查询我的 view.awaitingipn 来获取数据表中的字段吗?
  • 是的,您将使用您在视图中提供的列的名称。

标签: c# sql-server excel


【解决方案1】:

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

关于您的观点,您应该将 T & 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 & c 属性 ID 传入。

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多