簡體   English   中英

如何使用動態 pivot c# winform 將總計列和行插入 datagridview

[英]How to insert Grand Total column and row into datagridview with dynamic pivot c# winform

我的表單上有一個 datagridview,我用它來處理數據庫中的 pivot 信息。 這是我的查詢命令:

DECLARE @Date AS VARCHAR(MAX),
        @query AS VARCHAR(MAX)
        
SELECT 
    @dATE = STUFF((SELECT ',' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), CREATED, 101), '-', '/')) 
                   FROM repair_data_entry
                   WHERE MONTH(CREATED) = 12
                     AND YEAR(CREATED) = 2020
                   GROUP BY CREATED
                   ORDER BY CREATED
                   FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT NAME AS TECH, ' + @Date + ' 
              FROM  
                  (SELECT NAME, CREATED, REP  
                   FROM repair_data_entry) AS S  
              PIVOT  
                  (COUNT(REP)  
                      FOR CREATED IN ('+@Date+')  
                  ) P'
EXECUTE(@query)

SQL 小提琴

這是我嘗試獲取總計列和行的查詢:

DECLARE @Date1 VARCHAR(MAX),
        @Date2 VARCHAR(MAX),
        @GrandTotalCol VARCHAR(MAX),
        @GrandTotalRow VARCHAR(MAX),
        @FinalQuery VARCHAR(MAX)

SELECT @Date1 = STUFF((SELECT ',' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), CREATED, 101), '-', '/')) 
                       FROM repair_data_entry
                       WHERE MONTH(CREATED) = 12
                         AND YEAR(CREATED) = 2020
                       GROUP BY CREATED
                       ORDER BY CREATED
                       FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '')
        
SELECT @Date2  = COALESCE (@Date2 + ',[' + @Date1 + ']', '[' + @Date1 + ']')
FROM repair_data_entry 
GROUP BY CREATED
ORDER BY CREATED

SELECT @GrandTotalCol = COALESCE (@GrandTotalCol + 'ISNULL ([' + 
CAST (@Date1 AS VARCHAR) +'],0) + ', 'ISNULL([' + CAST(@Date1 AS VARCHAR)+ '],0) + ')
FROM repair_data_entry
GROUP BY CREATED
ORDER BY CREATED

SET @GrandTotalCol = LEFT (@GrandTotalCol, LEN (@GrandTotalCol)-1)
 
SELECT @GrandTotalRow = COALESCE(@GrandTotalRow + ',ISNULL(SUM([' + 
CAST(@Date1 AS VARCHAR)+']),0)', 'ISNULL(SUM([' + CAST(@Date1 AS VARCHAR)+']),0)')
FROM repair_data_entry
GROUP BY CREATED
ORDER BY CREATED
  
SET @FinalQuery = 'SELECT *, (' + @GrandTotalCol + ') 
AS [Grand Total] INTO  #temp
            FROM
                (SELECT NAME,CREATED,REP
                    FROM  repair_data_entry
                ) A
            PIVOT
                (
                 COUNT(REP)
                 FOR CREATED
                 IN ('  + @date1 +  ')
                ) B
ORDER BY NAME

SELECT * FROM  #temp_MatchesTotal 
UNION ALL
SELECT ''Grand Total'','''',' + @GrandTotalRow + ',  
ISNULL (SUM([Grand Total]),0) FROM  #temp

DROP TABLE  #temp'

EXECUTE(@FinalQuery) 

SQL 小提琴

我不斷收到此錯誤:

關鍵字“INTO”附近的語法不正確

我不確定該怎么做,但我知道有辦法。 這是我搜索和搜索並嘗試不同事物的最后手段。

這是我的 C# 代碼:

DateTime month = DateTime.Today;
DateTime year = DateTime.Today;

using (SqlConnection cn = new SqlConnection(@"connection"))
{
    cn.Open();

    using (SqlCommand cmdDashboard = new SqlCommand())
    {
        cmdDashboard.CommandText = "DECLARE @Date AS VARCHAR(MAX), @query AS VARCHAR(MAX) select @Date = STUFF((SELECT ',' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), DATE, 101), '-', '/')) FROM repair_data_entry WHERE MONTH(DATE) = '" + month.Month + "' AND YEAR(DATE) = '" + year.Year + "' GROUP BY DATE ORDER BY DATE FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'') set @query = 'SELECT NAME AS TECH, ' + @Date + ' FROM (SELECT NAME, DATE, REPAIR FROM repair_data_entry) AS S PIVOT (COUNT(REPAIR) FOR DATE IN('+@Date+')) P' EXECUTE(@query)";

        SqlDataAdapter dataadapter = new SqlDataAdapter(cmdDashboard);

        DataSet ds = new DataSet();
        cmdDashboard.Connection = cn;

        dataadapter.Fill(ds, "repair_data_entry");

        dataGridView1.DataSource = ds;
        dataGridView1.DataMember = "repair_data_entry";

        dataGridView1.Columns[0].Frozen = true;
        dataGridView1.Rows[0].Frozen = true;

        dataGridView1.Columns[0].DefaultCellStyle.BackColor = SystemColors.Control;

        foreach (DataGridViewColumn column in dataGridView1.Columns)
        {
            column.SortMode = DataGridViewColumnSortMode.NotSortable;
        }

        dataGridView1.ClearSelection();
        cn.Close();
    }
}

有些事情與小提琴不同,例如日期列和月份和年份。

我不確定這是否是正確的方法。 我還在學習 C# 和 SQL。

下面的這兩行看起來根本不正確,特別是當您嘗試使用 sum() function 准備 @GrandTotalRow 時

SELECT @GrandTotalCol = COALESCE (@GrandTotalCol + 'ISNULL ([' + 
CAST (@Date1 AS VARCHAR) +'],0) + ', 'ISNULL([' + CAST(@Date1 AS VARCHAR)+ '],0) + ')
FROM repair_data_entry
GROUP BY CREATED
ORDER BY CREATED

SET @GrandTotalCol = LEFT (@GrandTotalCol, LEN (@GrandTotalCol)-1)
 
SELECT @GrandTotalRow = COALESCE(@GrandTotalRow + ',ISNULL(SUM([' + 
CAST(@Date1 AS VARCHAR)+']),0)', 'ISNULL(SUM([' + CAST(@Date1 AS VARCHAR)+']),0)')
FROM repair_data_entry
GROUP BY CREATED
ORDER BY CREATED

這是 output 打印@GrandTotalCol:

ISNULL([[12/01/2020],[12/02/2020]],0) + ISNULL ([[12/01/2020],[12/02/2020]],0) + 

並打印@GrandTotalRow:

ISNULL(SUM([[12/01/2020],[12/02/2020]]),0),ISNULL(SUM([[12/01/2020],[12/02/2020]]),0)

他們都沒有產生有效的 sql 語法:

  • ISNULL(只需要2個arguments
  • SUM() 只需要 1 個 arguments
  • 不平衡 [[ 和 ]]

相反,我建議您更多地研究GROUP BY ROLLUP命令,這可能對您嘗試做的事情有所幫助。

好的,根據您的查詢,這是您需要做的:

 DECLARE @Datecolumns VARCHAR(MAX), @GrandTotalCol VARCHAR(MAX), @FinalQuery VARCHAR(MAX) SELECT @Datecolumns = STUFF((SELECT ',' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), CREATED, 101), '-', '/')) FROM repair_data_entry GROUP BY CREATED ORDER BY CREATED FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') set @GrandTotalCol = @Datecolumns + ',[GrandTotal]' SET @FinalQuery = 'SELECT * INTO #temp FROM ( select Name,case when GROUPING(CONVERT(VARCHAR(10), CREATED, 101)) = 1 then ''GrandTotal'' else CONVERT(VARCHAR(10), CREATED, 101) end as CREATED, COUNT(REP) REP from repair_data_entry group by name, ROLLUP (CONVERT(VARCHAR(10), CREATED, 101)) ) as source PIVOT ( SUM(REP) FOR CREATED IN (' + @GrandTotalCol + ') ) B ORDER BY NAME SELECT * FROM #temp DROP TABLE #temp' EXECUTE(@FinalQuery) GO
 姓名 |  2020 年 11 月 2 日 |  2020 年 12 月 1 日 |  2020 年 12 月 2 日 | 總計:---- |  ---------: |  ---------: |  ---------: |  ---------: 比爾 |  null |  6 |  5 |  11 比爾2 |  1 |  3 |  3 |  7

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM