从SQL查询构建和导出分层数据

时间:2013-12-24 16:43:34

标签: sql vb.net visual-studio

我要求按财政年度从sql server数据库查询9年的数据,然后根据以下要求将数据分解为excel文件

  

Excel表格 - >位置

     

Excel标签 - >商品

     

部分 - >运输方式

     

行 - >客户详细信息

该行需要以下信息:

  

客户名称,FY14蒲式耳,2014财年排名,FY 13蒲式耳,13财年   排名....等

我已经能够将我的信息构建到我所谓的locationdetail级别

Public Class LocationDetail

    Public Sub New(ByVal commodityid As String, ByVal commodityname As String, ByVal fiscalyear As String, ByVal shipmode As String, customerid As String, ByVal customername As String, ByVal quantityinlbs As Single, ByVal bushels As Single)

        Me.CommodityId = commodityid
        Me.CommodityName=commodityname
        Me.FiscalYear=fiscalyear
        Me.ShipMode=shipmode
        Me.CustomerId=customerid
        Me.CustomerName=customername
        Me.QuantityInLbs=quantityinlbs
        Me.Bushels=bushels

    End Sub


#Region " CommodityId "

    Private _commodityId As String
    Public Property CommodityId() As String
        Get
            Return _commodityId
        End Get
        Set(ByVal value As String)
            _commodityId = value
        End Set
    End Property

#End Region

#Region " CommodityName "

    Private _commodityName As String

    Public Property CommodityName() As String
        Get
            Return _commodityName
        End Get
        Set(ByVal value As String)
            _commodityName = value
        End Set
    End Property

#End Region

#Region " CommodityCollection "

    Private _commodityCollection As ICollection(Of Commodity)

    Public Property CommodityCollection() As ICollection(Of Commodity)
        Get
            Return _commodityCollection
        End Get
        Set(ByVal value As ICollection(Of Commodity))
            _commodityCollection = value
        End Set
    End Property

#End Region

#Region " FiscalYear "

    Private _fiscalYear As String

    Public Property FiscalYear() As String
        Get
            Return _fiscalYear
        End Get
        Set(ByVal value As String)
            _fiscalYear = value
        End Set
    End Property

#End Region

#Region " ShipMode "

    Private _shipMode As String

    Public Property ShipMode() As String
        Get
            Return _shipMode
        End Get
        Set(ByVal value As String)
            _shipMode = value
        End Set
    End Property

#End Region

#Region " CustomerId "

    Private _customerId As String

    Public Property CustomerId() As String
        Get
            Return _customerId
        End Get
        Set(ByVal value As String)
            _customerId = value
        End Set
    End Property

#End Region

#Region " CustomerName "

    Private _customerName As String

    Public Property CustomerName() As String
        Get
            Return _customerName
        End Get
        Set(ByVal value As String)
            _customerName = value
        End Set
    End Property

#End Region

#Region " QuantityInLbs "

    Private _quantityInLbs As Single

    Public Property QuantityInLbs() As Single
        Get
            Return _quantityInLbs
        End Get
        Set(ByVal value As Single)
            _quantityInLbs = value
        End Set
    End Property

#End Region

#Region " Bushels "

    Private _bushels As Single

    Public Property Bushels() As Single
        Get
            Return _bushels
        End Get
        Set(ByVal value As Single)
            _bushels = value
        End Set
    End Property

#End Region

#Region " Rank "

    Private _rank As Integer

    Public Property Rank() As Integer
        Get
            Return _rank
        End Get
        Set(ByVal value As Integer)
            _rank = value
        End Set
    End Property

#End Region



End Class

我目前的策略是为子级集合所需的每个级别的信息构建类,以获取该级别下所需的信息,例如:

LocationDetail would change to an ICollection<Commodity>
Commodity would have an ICollection<ShipMode> 
ShipMode would have an ICollection<Customer> 
Customer would have an ICollection<FiscalYears>

财政年度将有财政年度,QuantityInLBS,灌木,等级

我的想法是,这将允许我根据需要使用层次结构为每个集合构建我的Excel电子表格。

在开始这项努力之前,我需要知道是否有更简单的方法可以做到这一点?是否有更好的选择以我需要的格式输出数据?

我已经用SQL标记了这一点,并且认为可能有更好的方法直接从SQL执行此操作。

其他信息和说明

我无法使用存储过程,这是供应商数据库,我们对数据库具有只读访问权限。由于我使用的是Visual Studio 2008,因此我只能访问EF的初始版本,该版本不是很强大。我在提取我需要呈现的数据方面没有任何问题。我真的在寻找有关将其从我检索的格式转换为我需要呈现的格式的最佳方法的信息。这几乎感觉就像我试图转动数据,但不是所有的同时。请随时向我询问任何进一步的说明,因为我意识到这不是一个简单的问题,但我认为很多人都遇到过类似的问题。

2 个答案:

答案 0 :(得分:0)

我过去不得不做一些这样的事情,而且我已经通过几种不同的变化做到了这一点。

带有类的存储过程(ado.net)(旧方法)

具有类和Linq to SQL的实体框架

具有类和存储过程的实体框架

Nhibernate with Classes

对我来说,迄今为止最简单的方法是使用Entity Framework,Classes和Linq To SQL。

基本上,EF映射到您的类,然后使用Linq To SQL来切换您的数据,但是您确定是正确的。如果你有时间,我会调查EF和Linq to SQL。

显然,我要提出的另一点是,当你进入分层数据的想法时,如果你有一些严肃的层次结构,SSAS真的是处理这种性质的数据的地方。 (立方体)我之前也做过这个,但我不会建议这条路线,因为这需要花费大量的时间来适当地设置,并且可能对你的任务来说太过分了。

答案 1 :(得分:0)

我最终创建了一个RankedListingClass,它基本上迭代了主查询返回的数据,根据保证唯一数据的几个字段创建了一个复合唯一键,然后根据该键对每个唯一项进行排序。然后我根据需要使用该新类生成我的excel文档。

感谢linq的优点,否则整个地方会有更多的foreach循环。