2009-08-31 21 views
0

我有一个SQL Server 2005的输出是这样的:改变垂直数据插入到表布局的.Net

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来做到这一点。虽然我没有太多的运气。 “结果”值可以是动态的,并且日期将是动态的。

任何提示?

+0

你使用的数据库和版本是? – Gratzy

+0

SQL Server 2005 –

+0

检查这一个:http://stackoverflow.com/questions/1343145/tsql-pivot-without-aggregate-function –

回答

3

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

这是一个MSDN article on PIVOT

+0

(并且我对SQL不太好) –

+1

听起来像是获得更好SQL的好时机。 :) – mrdenny

+0

如果只有SQL会变得更好,那么我将不必:) –

0

这是我的解决方案。让它工作的最棘手的部分是意识到我不得不使用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