【问题标题】:Changing vertical data into a table layout in .Net在.Net中将垂直数据更改为表格布局
【发布时间】:2023-03-24 12:42:01
【问题描述】:

我有一个这样的 SQL Server 2005 输出:

Date | Result | Sum
-----|--------|-----
8/26 |   01   | 1549
8/26 |   02   | 7972
8/26 |   03   | 4502
8/27 |   01   | 1897
8/27 |   02   | 1649
8/27 |   03   | 7949
8/28 |   01   | 8542
8/28 |   02   | 5335
8/28 |   03   | 4445

我希望它像这样显示(在 GridView 中?):

Result | 8/26 | 8/27 | 8/28
-------|------|------|------
  01   | 1549 | 1897 | 8542
  02   | 7972 | 1649 | 5335
  03   | 4502 | 7949 | 4445

我目前的尝试是尝试通过来自 SqlDataSource 的 DataView 以及新的 DataSet 来执行此操作。不过我运气不太好。 “结果”值可以是动态的,日期也可以是动态的。

有什么建议吗?

【问题讨论】:

  • 您使用的是什么数据库和版本?
  • 我不太喜欢动态 SQL
  • @d03boy:“我不知道列名提前”,你别无选择:(
  • 你让我在里面哭泣。

标签: .net asp.net sql-server-2005


【解决方案1】:

与其尝试在 .NET 端进行更改,不如修改您的存储过程以对数据进行 Pivot,这将允许您获得所需的确切结构。

这是MSDN article on PIVOT

【讨论】:

  • (我不太擅长 SQL)
  • 如果只有 SQL 会变得更好,那我就不必了 :)
  • 嗯,您可以使用动态 SQL 语句来完成,甚至还有一种风险很小的方法。请参阅这篇文章 - stackoverflow.com/questions/213702/…。我也有一篇关于它的文章,将在 SQL Server 杂志上发表,但要到 11 月才会发表......
【解决方案2】:

这是我的解决方案。让它工作的最棘手的部分是意识到我必须使用WITH x as 语法,因为我以前从未听说过它。

WITH x as (
    SELECT Days.Date, Disps.HisResult, SUM(CASE WHEN Historic.HisResult IS NULL THEN 0 ELSE 1 END) AS SumResult
    FROM (
        SELECT DISTINCT DATEADD(day, DATEDIFF(day, 0, DATEADD(hh, -5, HisCallDate)), 0) as Date FROM Historic
    ) AS Days
    LEFT JOIN (SELECT DISTINCT roxcoDispCode as HisResult FROM RoxcoSystem.dbo.DispCodes) AS Disps ON 1=1
    LEFT JOIN Historic ON Disps.HisResult = Historic.HisResult AND Days.Date = DATEADD(day, DATEDIFF(day, 0, DATEADD(hh, -5, HisCallDate)), 0)
    GROUP BY Days.Date, Disps.HisResult
)
SELECT * FROM x
PIVOT
(
  MAX(SumResult)
  FOR HisResult IN ([00], [01], [02], [03])
)
AS p

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多