我的数据库有一个 SQL View ,可以使用 Lot 和 PartNumberId 打印 C# 和 Itext7 的报告来查找结果
DECLARE @LotId int = '1'
DECLARE @PartNumerId int = '100'
SELECT * FROM vw_report_diarydefects WHERE LotId = @LotId AND PartNumerId = @PartNumerId
我想要做的是将 SortingDate 作为列并在其上添加数量,如下所示:
我使用了pivot(我第一次使用它)并且我已经使用了这个:
DECLARE @StuffColumn varchar(max)
DECLARE @sql varchar(max)
DECLARE @LotId int = '1'
DECLARE @PartNumerId int = '100'
SELECT @StuffColumn = STUFF((SELECT distinct ','+QUOTENAME(SortingDate)
FROM vw_report_diarydefects
WHERE LotId = @LotId AND PartNumerId = @PartNumerId
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @SQL = ' select Defect, '+ @StuffColumn +'
from
(
select SortingDate,Defect,Qty
from vw_report_diarydefects
where LotId = ''' + CONVERT(NVARCHAR(50), @LotId, 121)+ ''' and PartNumerId = ''' + CONVERT(NVARCHAR(50), @PartNumerId, 121)+ '''
)x
pivot
(
Sum(Qty)
for SortingDate in( '+@StuffColumn+' )
)p'
EXEC(@SQL)
得到这个:
有没有办法用数量数据填充日期列?这是我第一次使用 Pivot,我正在阅读该说明,但我仍然有一些疑问。
最佳答案
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication193
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Lot",typeof(int));
dt.Columns.Add("PartNumberId",typeof(int));
dt.Columns.Add("PartNumber",typeof(string));
dt.Columns.Add("DefectId",typeof(int));
dt.Columns.Add("Defect",typeof(string));
dt.Columns.Add("Qty", typeof(int));
dt.Columns.Add("SortingDate", typeof(DateTime));
dt.Rows.Add(new object[] {1, 100, "WD40", 1, "Broken", 9, DateTime.Parse("2019-10-01 10:31:02.000")});
dt.Rows.Add(new object[] {1, 100, "WD40", 2, "Paint Scratch", 10, DateTime.Parse("2019-10-02 10:31:02.000")});
dt.Rows.Add(new object[] {1, 100, "WD40", 3, "Swollen", 8, DateTime.Parse("2019-10-02 10:31:02.000")});
dt.Rows.Add(new object[] {1, 100, "WD40", 2, "Paint Scratch", 10, DateTime.Parse("2019-10-03 10:31:02.000")});
dt.Rows.Add(new object[] {1, 100, "WD40", 4, "Bent", 5, DateTime.Parse("2019-10-04 10:31:02.000")});
DateTime[] dates = dt.AsEnumerable().Select(x => x.Field<DateTime>("SortingDate")).OrderBy(x => x).Distinct().ToArray();
DataTable pivot = new DataTable();
pivot.Columns.Add("Defect");
foreach (DateTime date in dates)
{
pivot.Columns.Add(date.ToString(), typeof(int));
}
foreach(var defect in dt.AsEnumerable().GroupBy(x => x.Field<string>("Defect")))
{
DataRow newRow = pivot.Rows.Add();
newRow["Defect"] = defect.Key;
foreach (DataRow row in defect)
{
int qty = row.Field<int>("Qty");
DateTime date = row.Field<DateTime>("SortingDate");
newRow[date.ToString()] = qty;
}
}
}
}
}
关于c# - 将日期时间作为包含数量字段的列的 SQL 透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68212197/