Свяжите данные из базы данных и вращайте / перемещайте данные - PullRequest
0 голосов
/ 04 июля 2018

Я хочу получить данные из базы данных SQL и связать их с управлением (Datagridview / Datalist). Сделайте вывод в формате таблицы, и он будет отображать строки в виде столбца, а столбцы в виде строк.

У меня есть одна таблица: tbl_CustData с двумя полями, такими как FixedDepDate (тип данных datetime), а другая - Month_year (тип данных nvarchar) . Значения следующие:

 FixedDepDate            |  Month_year   |
-------------------------+---------------+
2018-07-03 00:00:00.000  | March - 18    |  
2018-08-23 00:00:00.000  | August - 2018 | 
2018-08-29 00:00:00.000  | August - 2018 |
2018-07-04 00:00:00.000  | July - 2018   |
2018-07-10 00:00:00.000  | July - 2018   |
2018-07-25 00:00:00.000  | July - 2018   |

Ожидаемый результат:

March - 18    | 03
July - 18     | 04 | 10 | 25
August - 18   | 23 | 29

Я уже попробовал следующие методы, но не получил ожидаемый результат.

  1. Использовал элемент управления Datalist / Gridview и пытался связать данные
  2. Используется оператор PIVOTE, но не получается вывод.

Также, пожалуйста, дайте некоторое представление о том, какой элемент управления подходит для привязки данных и отображения на моей веб-странице или какой-либо другой метод для решения этой проблемы. Примечание: я не использую какие-либо события, чтобы показать мой вывод. Хочу отобразить мой вывод прямо на моей странице после запуска проекта.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Я не понимаю, зачем вам это нужно в T-SQL, когда вы собираетесь связываться с DataGridView. В любом случае:

CREATE TABLE #temp (
    [FixedDepDate] DATETIME );

INSERT INTO #temp
(
    [FixedDepDate]
)
VALUES
('2018-03-07 00:00:00.000'),
('2018-08-23 00:00:00.000'),
('2018-08-29 00:00:00.000'),
('2018-07-04 00:00:00.000'),
('2018-07-10 00:00:00.000'),
('2018-07-25 00:00:00.000');



SELECT ym.YearMonth,
       (
           SELECT RIGHT('0' + LTRIM(STR(DAY(FixedDepDate))), 2) + ' | '
           FROM #temp t
           WHERE YEAR(t.FixedDepDate) = ym.y
                 AND MONTH(t.FixedDepDate) = ym.m
           FOR XML PATH('')
       ) AS [Days]
FROM
(
    SELECT DISTINCT
           DATENAME(MONTH, FixedDepDate) + ' - ' + DATENAME(YEAR, FixedDepDate) AS YearMonth,
           YEAR(FixedDepDate) AS y,
           MONTH(FixedDepDate) AS m
    FROM #temp
) AS [ym]
ORDER BY y,
         m;

DROP TABLE #temp;
0 голосов
/ 06 июля 2018

Вы должны четко объяснить, что вы хотите с самого начала.

CREATE TABLE #temp
(
    [FixedDepDate] DATETIME
);

INSERT INTO #temp
(
    [FixedDepDate]
)
VALUES
('2018-03-07 00:00:00.000'),
('2018-08-23 00:00:00.000'),
('2018-08-29 00:00:00.000'),
('2018-07-04 00:00:00.000'),
('2018-07-10 00:00:00.000'),
('2018-07-25 00:00:00.000');

WITH source AS
(
SELECT 
     YEAR(FixedDepDate) AS y,
     MONTH(FixedDepDate) AS m, 
     DATENAME(MONTH, FixedDepDate) + ' - ' + 
     DATENAME(YEAR, FixedDepDate) AS YearMonth,
     ROW_NUMBER() OVER (
        PARTITION BY YEAR(FixedDepDate) * 10000 + 
                    MONTH(FixedDepDate)
        ORDER BY DAY(FixedDepDate)) AS nDay,
     RIGHT('0' + LTRIM(STR(DAY(FixedDepDate))), 2) AS cDay
FROM #temp
)
SELECT YearMonth, [1], [2], [3]
       FROM source
       PIVOT ( max(cDay) 
       FOR [nDay] IN ( [1], [2], [3] )
       ) pvt
ORDER BY y,m;

DROP TABLE #temp;

EDIT:

void Main()
{
    DataTable tbl = new DataTable();

    using (SqlConnection con = new SqlConnection(@"server=.\SQLExpress2012;Database=Test;Trusted_connection=yes"))
    {
        con.Open();
        var columns = Convert.ToInt32(new SqlCommand(@"SELECT MAX(cnt)
                                    FROM
                                    (
                                        SELECT COUNT(*) AS cnt
                                        FROM MyDates
                                        GROUP BY YEAR(FixedDepDate),
                                                 MONTH(FixedDepDate)
                                    ) tmp;", con)
                        .ExecuteScalar());

        var collist = string.Join(",", Enumerable.Range(1, columns).Select(e => $"[{e}]"));
        var pivot = $@"WITH source AS
(
SELECT 
     YEAR(FixedDepDate) AS y,
     MONTH(FixedDepDate) AS m, 
     DATENAME(MONTH, FixedDepDate) + ' - ' + 
     DATENAME(YEAR, FixedDepDate) AS YearMonth,
     ROW_NUMBER() OVER (
        PARTITION BY YEAR(FixedDepDate) * 10000 + 
                    MONTH(FixedDepDate)
        ORDER BY DAY(FixedDepDate)) AS nDay,
     RIGHT('0' + LTRIM(STR(DAY(FixedDepDate))), 2) AS cDay
FROM Mydates
)
SELECT YearMonth, {collist}
       FROM source
       PIVOT ( max(cDay) 
       FOR [nDay] IN ( {collist} )
       ) pvt
ORDER BY y,m;
";

        tbl.Load( new SqlCommand(pivot,con).ExecuteReader());
        con.Close();
    }


    var f = new Form();
    var dgv = new DataGridView {Dock=DockStyle.Fill, DataSource=tbl};
    f.Controls.Add(dgv);
    f.Show();
}
0 голосов
/ 04 июля 2018

Вы можете группировать по годам, месяцам, а затем агрегировать дни за этот период. то есть:

var result = from d in db.MyTable.AsEnumerable()
             group d by d.FixedDepDate.ToString("MMMM-yyyy")
             into g
             select new
             {
                 Period = g.Key,
                 Days = string.Join(" | ", g.Select(x => x.FixedDepDate.Day))
             };

С вашими выборочными данными (исправленными) вывод:

Period       Days

March-2018   7 
August-2018  23 | 29 
July-2018    4 | 10 | 25 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...