c# - 将日期时间作为包含数量字段的列的 SQL 透视

标签 c# sql sql-server web-services pivot

我的数据库有一个 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
<表类=“s-表”> <标题> 地 block 零件编号 零件编号 缺陷 ID 缺陷 数量 排序日期 <正文> 1 100 WD40 1 损坏 9 2019-10-01 10:31:02.000 1 100 WD40 2 油漆划痕 10 2019-10-02 10:31:02.000 1 100 WD40 3 肿胀 8 2019-10-02 10:31:02.000 1 100 WD40 2 油漆划痕 10 2019-10-03 10:31:02.000 1 100 WD40 4 弯曲 5 2019-10-04 10:31:02.000

我想要做的是将 SortingDate 作为列并在其上添加数量,如下所示:

<表类=“s-表”> <标题> 缺陷 2019-10-01 10:31:02.000 2019-10-02 10:31:02.000 2019-10-03 10:31:02.000 2019-10-04 10:31:02.000 <正文> 损坏 9 0 0 0 油漆划痕 0 10 10 0 肿胀 0 8 0 0 弯曲 0 0 0 5

我使用了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) 

得到这个:

<表类=“s-表”> <标题> 缺陷 2019 年 10 月 1 日上午 10:31 2019 年 10 月 2 日上午 10:31 2019 年 10 月 3 日上午 10:31 2019 年 10 月 4 日上午 10:31 <正文> 损坏 空 空 空 空 油漆划痕 空 空 空 空 肿胀 空 空 空 空 弯曲 空 空 空 空

有没有办法用数量数据填充日期列?这是我第一次使用 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/

相关文章:

sql-server - 慢速 SQL Server CLR 聚合

c# - 无法加载文件或程序集“Microsoft.Practices.EnterpriseLibrary.Caching”

c# - 主页检查 session 问题

c# - 在 C 库调用中保留对 .NET 对象的 C++/CLI 句柄

MySQL SELECT DISTINCT 返回不同的结果

sql-server - 删除 SQL Server 中字符串中的所有空格

c# - 关于平台游戏 Actor /背景碰撞解决的意见

SQL将样本点转换为持续时间

SQL 查询获取顶行直到 ColName = 1

C# SQL 注入(inject)