[英]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)
这是我尝试获取总计列和行的查询:
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)
我不断收到此错误:
关键字“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 语法:
相反,我建议您更多地研究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.