Заполнение Datagrid и Sql запроса

У меня есть 3 таблицы в базе данных, показанной ниже. И я хочу сделать отчет, как показано по ссылке ниже. Как я могу это сделать с помощью datagrid или datalist? Какой из них лучший выбор? Я пробовал это делать неделю.

Заполнение Datagrid и Sql запроса

COMPANY: ID_COMPANY, COMPANY_NAME

PRODUCT: ID_PRODUCT, PRODUCT_NAME

PRODUCT_SALE: ID_COMPANY, ID_PRODUCT, SALE_COUNT

Обновлено:

Я мог бы сделать это с твоей помощью. Однако теперь у меня тоже есть небольшая проблема.

Когда я пишу запрос с помощью pivot, название продукта становится заголовком столбца. если длина названия продукта превышает 30 символов, Oracle не принимает его в качестве заголовка столбца. Чтобы решить эту проблему, я обрезал и сделал названия продуктов 30 символами. После этого тоже возникла проблема.

Когда я обрезаю название продукта как 30 символов, некоторые продукты становятся такими же, и появляется сообщение об ошибке «ORA-00918: столбец неоднозначно определен».

В этом случае что можно сделать?

есть ли ограниченное количество компаний или продуктов?

DevelopingChris 02.12.2008 09:10

если вы хотите больше ответов, сделайте заголовок немного понятнее (Datagrid, Sql, Dynamic Columns)

Mark Glorie 02.12.2008 09:24

Я обновляю оба ответа в вашем актуальном вопросе и рекомендую удалить ответы. Так что сайт будет чистым.

Ajay2707 31.12.2015 10:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
2 188
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Какую версию SQL вы используете? Использование PIVOT может быть быстрым способом получить данные в нужной форме, а затем вы можете использовать общий DataGrid, чтобы просто отображать данные в (почти) «сырой» форме, то есть в том виде, в котором данные представлены SQL-сервер. Тогда вы могли бы думать о DataGrid больше как о электронной таблице, чем о представлении таблицы данных в том виде, в каком она находится в базе данных.

Вот хороший стартовый документ о том, как использовать PIVOT для представления данных в той форме, которая вам нужна:

http://www.tsqltutorials.com/pivot.php

Конечно, я думаю, что это может быть доступно только в SQL 2005 ... поэтому, если вы используете более старую версию, это может не помочь.

Обновлено:

В Oracle 10g вам понадобится расширение MODEL, это не Мир, отличный от PIVOT в SQL, но, очевидно, Oracle 10g делает все по-своему: Проверить эту ссылку

Вам дано 2 ответа, я обновил ваш первый ответ и рекомендую удалить второй.

Ajay2707 31.12.2015 10:25

Следующее будет работать, если номера продуктов статичны:

<asp:gridview>
    <columns>
        <asp:boundfield datafield = "companyname" itemstyle-headertext = "" />
        <asp:boundfield datafield = "SALE_COUNT" itemstyle-headertext='<%# FunctionToLoadurproduct(product1) %>' />
        <asp:boundfield datafield = "SALE_COUNT" itemstyle-headertext='<%# FunctionToLoadurproduct(product1) %>' />

        and so on...
    </columns>
</gridview >

Управляйте продажами продукта в соответствии с идентификатором продукта в вашем запросе с помощью встроенных запросов.

Мне кажется, это перекрестный отчет. У вас есть 2 варианта сделать это

  1. Сверните данные в базе данных и привяжите их к сетке данных. Точный синтаксис этого будет зависеть от используемого движка базы данных. Вот пример на SQL
  2. Используйте инструмент отчетности, который может создавать перекрестные таблицы на основе простого соединения, например SQL Reporting Services, Crystal Reports, XtraReports и т. д.

В Oracle 10g вам понадобится расширение MODEL, это не Мир, отличный от PIVOT в SQL, но, очевидно, Oracle 10g делает все по-своему:

http://technology.amis.nl/blog/300/pivoting-in-sql-using-the-10g-model-clause

Используйте вложенный элемент управления повторителями. Внешний репитер будет повторять Компании, а внутренний - Продукты.

Ответ принят как подходящий

Используйте стандартный sql-запрос (сводные таблицы дороги с точки зрения производительности) и создайте настраиваемую функцию сводной таблицы в коде на стороне сервера. Вот пара примеров.

''' <summary>
''' Pivots columnX as new columns for the X axis (must be unique values) and the remaining columns as 
''' the Y axis. Optionally can include columns to exclude from the Y axis.
''' </summary>
''' <param name = "dt"></param>
''' <param name = "columnX"></param>
''' <param name = "columnsToIgnore"></param>
''' <returns>DataTable</returns>
''' <remarks></remarks>
Public Shared Function Pivot(ByVal dt As DataTable, ByVal columnX As String, ByVal ParamArray columnsToIgnore As String()) As DataTable

    Dim dt2 As New DataTable()

    If columnX = "" Then
        columnX = dt.Columns(0).ColumnName
    End If

    'Add a Column at the beginning of the table 
    dt2.Columns.Add(columnX)

    'Read all DISTINCT values from columnX Column in the provided DataTable 
    Dim columnXValues As New List(Of String)()

    'Create the list of columns to ignore 
    Dim listColumnsToIgnore As New List(Of String)()
    If columnsToIgnore.Length > 0 Then
        listColumnsToIgnore.AddRange(columnsToIgnore)
    End If

    If Not listColumnsToIgnore.Contains(columnX) Then
        listColumnsToIgnore.Add(columnX)
    End If

    ' Add the X axis columns
    For Each dr As DataRow In dt.Rows
        Dim columnXTemp As String = dr(columnX).ToString()
        If Not columnXValues.Contains(columnXTemp) Then
            columnXValues.Add(columnXTemp)
            dt2.Columns.Add(columnXTemp)
        Else
            Throw New Exception("The inversion used must have unique values for column " + columnX)
        End If
    Next

    'Add a row for each non-columnX of the DataTable 
    For Each dc As DataColumn In dt.Columns
        If Not columnXValues.Contains(dc.ColumnName) AndAlso Not listColumnsToIgnore.Contains(dc.ColumnName) Then
            Dim dr As DataRow = dt2.NewRow()
            dr(0) = dc.ColumnName
            dt2.Rows.Add(dr)
        End If
    Next

    'Complete the datatable with the values 
    For i As Integer = 0 To dt2.Rows.Count - 1
        For j As Integer = 1 To dt2.Columns.Count - 1
            dt2.Rows(i)(j) = dt.Rows(j - 1)(dt2.Rows(i)(0).ToString()).ToString()
        Next
    Next

    Return dt2

End Function

''' <summary>
''' Can pivot any column as X, any column as Y, and any column as Z. Sort on X, sort on Y and optionally, the 
''' values at the intersection of x and y (Z axis) can be summed.
''' </summary>
''' <param name = "dt"></param>
''' <param name = "columnX"></param>
''' <param name = "columnY"></param>
''' <param name = "columnZ"></param>
''' <param name = "nullValue"></param>
''' <param name = "sumValues"></param>
''' <param name = "xSort"></param>
''' <param name = "ySort"></param>
''' <returns>DataTable</returns>
''' <remarks></remarks>
Public Shared Function Pivot(ByVal dt As DataTable, ByVal columnX As String, ByVal columnY As String, ByVal columnZ As String, _
    ByVal nullValue As String, ByVal sumValues As Boolean, ByVal xSort As Sort, ByVal ySort As Sort) As DataTable

    Dim dt2 As New DataTable()
    Dim tickList As List(Of Long) = Nothing

    If columnX = "" Then
        columnX = dt.Columns(0).ColumnName
    End If

    'Add a Column at the beginning of the table 
    dt2.Columns.Add(columnY)

    'Read all DISTINCT values from columnX Column in the provided DataTable 
    Dim columnXValues As New List(Of String)()
    Dim cols As Integer = 0

    For Each dr As DataRow In dt.Rows
        If dr(columnX).ToString.Contains("'") Then
            dr(columnX) = dr(columnX).ToString.Replace("'", "")
        End If
        If Not columnXValues.Contains(dr(columnX).ToString) Then
            'Read each row value, if it's different from others provided, 
            'add to the list of values and creates a new Column with its value. 
            columnXValues.Add(dr(columnX).ToString)
        End If
    Next

    'Sort X if needed
    If Not xSort = Sort.None Then
        columnXValues = SortValues(columnXValues, xSort)
    End If

    'Add columnX
    For Each s As String In columnXValues
        dt2.Columns.Add(s)
    Next

    'Verify Y and Z Axis columns were provided 
    If columnY <> "" AndAlso columnZ <> "" Then
        'Read DISTINCT Values for Y Axis Column 
        Dim columnYValues As New List(Of String)()

        For Each dr As DataRow In dt.Rows
            If dr(columnY).ToString.Contains("'") Then
                dr(columnY) = dr(columnY).ToString.Replace("'", "")
            End If
            If Not columnYValues.Contains(dr(columnY).ToString()) Then
                columnYValues.Add(dr(columnY).ToString())
            End If
        Next

        ' Now we can sort the Y axis if needed. 
        If Not ySort = Sort.None Then
            columnYValues = SortValues(columnYValues, ySort)
        End If

        'Loop all Distinct ColumnY Values
        For Each columnYValue As String In columnYValues
            'Create a new Row 
            Dim drReturn As DataRow = dt2.NewRow()
            drReturn(0) = columnYValue
            Dim rows As DataRow() = dt.[Select](columnY + "='" + columnYValue + "'")

            'Read each row to fill the DataTable 
            For Each dr As DataRow In rows
                Dim rowColumnTitle As String = dr(columnX).ToString()

                'Read each column to fill the DataTable 
                For Each dc As DataColumn In dt2.Columns
                    If dc.ColumnName = rowColumnTitle Then
                        'If sumValues, try to perform a Sum 
                        'If sum is not possible due to value types, use the nullValue string
                        If sumValues Then
                            If IsNumeric(dr(columnZ).ToString) Then
                                drReturn(rowColumnTitle) = Val(drReturn(rowColumnTitle).ToString) + Val(dr(columnZ).ToString)
                            Else
                                drReturn(rowColumnTitle) = nullValue
                            End If
                        Else
                            drReturn(rowColumnTitle) = dr(columnZ).ToString
                        End If
                    End If
                Next
            Next

            dt2.Rows.Add(drReturn)

        Next
    Else
        Throw New Exception("The columns to perform inversion are not provided")
    End If

    'if nullValue param was provided, fill the datable with it 
    If nullValue <> "" Then
        For Each dr As DataRow In dt2.Rows
            For Each dc As DataColumn In dt2.Columns
                If dr(dc.ColumnName).ToString() = "" Then
                    dr(dc.ColumnName) = nullValue
                End If
            Next
        Next
    End If

    Return dt2

End Function

''' <summary>
''' Sorts a list of strings checking to see if they are numeric or date types.
''' </summary>
''' <param name = "list"></param>
''' <param name = "srt"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Shared Function SortValues(ByVal list As List(Of String), ByVal srt As Sort) As List(Of String)

    Dim tickList As List(Of Long) = Nothing
    Dim dblList As List(Of Double) = Nothing

    ' Figure out how to sort columnX
    For Each s As String In list
        Dim colDate As Date = Nothing
        If Date.TryParse(s, colDate) Then
            tickList = New List(Of Long)
            Exit For
        End If
    Next

    Dim dateTicks As Long

    If Not tickList Is Nothing Then
        For Each s As String In list
            dateTicks = DateTime.Parse(s).Ticks
            If Not tickList.Contains(dateTicks) Then
                tickList.Add(dateTicks)
            End If
        Next

        If srt = Sort.DESC Then
            tickList.Sort()
            tickList.Reverse()
        ElseIf srt = Sort.ASC Then
            tickList.Sort()
        End If

        list.Clear()
        For Each lng As Long In tickList
            list.Add(New Date(lng).ToString("G"))
        Next
    Else
        Dim dbl As Double = Nothing

        For Each s As String In list
            If IsNumeric(s) Then
                dblList = New List(Of Double)
            End If
        Next

        If Not dblList Is Nothing Then
            'Doubles or Integers
            For Each s As String In list
                dbl = Val(s)
                If Not dblList.Contains(dbl) Then
                    dblList.Add(dbl)
                End If
            Next

            If srt = Sort.DESC Then
                dblList.Sort()
                dblList.Reverse()
            ElseIf srt = Sort.ASC Then
                dblList.Sort()
            End If

            list.Clear()
            For Each d As Double In dblList
                list.Add(d.ToString)
            Next
        Else
            'Strings
            If srt = Sort.DESC Then
                list.Sort()
                list.Reverse()
            ElseIf srt = Sort.ASC Then
                list.Sort()
            End If
        End If

    End If

    Return list

End Function

Другие вопросы по теме