如何在SQL Server数据库中创建动态列并报告VB.NET?

时间:2017-01-20 10:19:57

标签: sql-server vb.net datagridview

我在使用包含动态列的动态DataGridView设计表单时遇到问题。

想法是让DataGridView列和行以相同的行和列顺序显示公司的所有部门,以显示它们彼此发送的消息数量(从D1行到D2列),如果这很容易我修复了数据库表列。

但问题是,如果公司添加新部门,如何使用动态数据库表列和报告页面列来实现这个想法?

在这种情况下,我需要在数据库表和报告页面中添加一个新列

image image of tables i made

1 个答案:

答案 0 :(得分:0)

实际上,您可以通过不同的方式存储数据,但只有区别在于您如何呈现数据。

在您的情况下,您希望以行方式列显示数据,您也可以在代码端设计。

重点是如何存储数据。

为此,您可以通过为部门及其相关消息创建“Department”和“DepartmentMessageDetails”的不同表格,以标准化形式存储数据。

或者您也可以将其以非规范化形式存储在单个表格中。

报告时。您可以使用动态SQL脚本创建存储过程并在那里设计表。

样品:

DECLARE @Department TABLE
(
    DNAM NVARCHAR(100),
    DNO INT
)
INSERT INTO @Department
        ( DNAM, DNO )
VALUES  ( N'D1', 1),
        ( N'D2', 2),
        ( N'D3', 3)

DECLARE @Message TABLE
(
    DNO INT,
    [D1] NVARCHAR(100),
    [D2] NVARCHAR(100),
    [D3] NVARCHAR(100)
)
INSERT INTO @Message
        ( DNO, D1, D2, D3 )
VALUES  ( 1, N'T1_D1', N'T1_D2', N'T1_D3')--, ( 1, N'Test3 D2')
        ,( 1, N'', N'Test1 D1', N'')
        ,( 1, N'T1_D1', N'', N'')
        ,( 1, N'', N'T1_D2', N'')
        ,( 1, N'', N'', N'T1_D3')
        ,( 1, N'', N'', N'T1_D3')

        ,( 2, N'T2_D1', N'T2_D2', N'T2_D3')--, ( 2, N'Test3 D2')
        ,( 2, N'T2_D1', N'', N'')
        ,( 2, N'', N'T2_D2', N'')
        ,( 2, N'', N'', N'T2_D3')
        ,( 2, N'', N'', N'T2_D3')
        ,( 2, N'', N'', N'T2_D3')

        ,( 3, N'T3_D1', N'T3_D2', N'T3_D3')--, ( 3, N'Test3 D3')
        ,( 3, N'T3_D1', N'', N'')
        ,( 3, N'', N'T3_D2', N'')
        ,( 3, N'', N'', N'T3_D3')

SELECT * FROM @Department
SELECT * FROM @Message

;WITH T AS 
(
    SELECT DISTINCT
        (CASE WHEN DNO = 1 THEN 'D1'
            WHEN DNO = 2 THEN 'D2'
            WHEN DNO = 3 THEN 'D3'
        END) AS Names
        , DNO
    FROM 
        @Message    
)
SELECT 
    T1.Names ,
    (CASE 
        WHEN T1.Names = 'D1' THEN -1 
        WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D2, '') <> ''))
        ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D3, '') <> '')) 
    END) AS D1 ,
    (CASE WHEN T1.Names = 'D2' THEN -1  
        WHEN T1.Names = 'D1' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D1, '') <> ''))
        ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D3, '') <> ''))
    END) AS D2 ,
    (CASE WHEN T1.Names = 'D3' THEN -1  
        WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D2, '') <> ''))
        ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D1, '') <> ''))
    END) AS D3
FROM T T1

在这个示例中,我使用了硬编码列名,但是如果我们编写动态查询也可以处理,我稍后会跳过它。