如何在特定行中显示数据? [英] How to display data in a particular row?

查看:103
本文介绍了如何在特定行中显示数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下存储过程,它将显示UserName,CountDate in count,ActualDate in count和CompletePercentage。结果是六月份。我怎样才能显示6月连续记录,剩下的几个月我将设置为0.例如

输出

======== ==

1月0 0

2月0 0 0

3月0 0

4月0 0 0

5月0 0 0

6月1日80









i我不确定是否应该在c#代码或sql中进行此分组。因此,我将使用devexpress将其转换为c#中的报告。以下是我的代码:



Hi, i have the following stored procedure which will display the UserName, TargetDate in count, ActualDate in count and the CompletePercentage. Results get are in June. How can i display the records i get into a row June and the rest of the months i will set to 0. E.g.
Output
==========
Jan 0 0 0
Feb 0 0 0
Mar 0 0 0
Apr 0 0 0
May 0 0 0
Jun 1 1 80
.
.
.

i am not sure whether i should do this grouping in c# code or sql. Whereby i will make this into a report in c# using devexpress. Below are my codes:

ALTER PROCEDURE [dbo].[GetCustomizationDeliveryStatusByDevNameByDate]
	-- Add the parameters for the stored procedure here
	@DEVNAME VARCHAR(MAX),
	@YEAR VARCHAR(MAX)
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	DECLARE @SQL NVARCHAR(MAX)
	DECLARE @SQL2 NVARCHAR(MAX)
	DECLARE @SQL3 NVARCHAR(MAX)
	DECLARE @SQL4 NVARCHAR(MAX)

	SELECT @SQL = ' CREATE TABLE #TargetDateTblx(IssueID VARCHAR(100), TargetDate VARCHAR(100))
        		INSERT [#TargetDateTblx]
        		SELECT issueid, [fielddata] AS TargetDate
        		FROM rndbug.dbo.gemini_customfielddata
        		WHERE customfieldid = 215					
        		
        		
        		CREATE TABLE #ActualDateTblx(IssueID VARCHAR(100), ActualDate VARCHAR(100))
			INSERT [#ActualDateTblx]
			SELECT issueid, [fielddata] AS ActualDate
			FROM rndbug.dbo.gemini_customfielddata
			WHERE customfieldid = 217					
			
			
			CREATE TABLE #CompleteRateTblx(IssueID VARCHAR(100), CompleteRate VARCHAR(100))
			INSERT [#CompleteRateTblx]
			SELECT issueid, [fielddata] AS CompleteRate
			FROM rndbug.dbo.gemini_customfielddata
			WHERE customfieldid = 234					
			
			
			CREATE TABLE #ALLTB(IssueID VARCHAR(100), UserID VARCHAR(100), UserName VARCHAR(100), TargetDate VARCHAR(100), ActualDate VARCHAR(100), CompleteRate VARCHAR(100))
			INSERT [#ALLTB]
			SELECT a.issueid,a.userid,b.username,c.TargetDate,d.ActualDate,e.CompleteRate
			FROM dbo.gemini_issueresources A, dbo.gemini_users B, #TargetDateTblx c, #ActualDateTblx d, #CompleteRateTblx e
			WHERE a.userid = b.userid AND a.issueid = c.IssueID AND  a.issueid = d.IssueID AND  a.issueid = e.IssueID
					'
					
		SET @SQL2 =	'CREATE TABLE #FORMULA(UserID VARCHAR(100), TargetDate VARCHAR(100), ActualDate VARCHAR(100), CompleteRate VARCHAR(100))
				INSERT [#FORMULA]
				SELECT UserID, COUNT(TargetDate) AS TargetDate, COUNT(ActualDate) AS ActualDate, SUM(CONVERT(INT, CompleteRate)) AS CompleteRate FROM #ALLTB					
				GROUP BY UserID
				
				SELECT B.username, F.TargetDate, F.ActualDate, (CONVERT(INT, F.CompleteRate)/F.TargetDate) AS CompletePercentage 
				FROM #FORMULA F, dbo.gemini_users B, #ALLTB A
				WHERE B.username IN ('+@DEVNAME+') AND F.UserID = B.UserID AND F.UserID = A.UserID
					'
					
		SET @SQL3 = 'CREATE TABLE #FORMULA(UserID VARCHAR(100), TargetDate VARCHAR(100), ActualDate VARCHAR(100), CompleteRate VARCHAR(100))
        		     INSERT [#FORMULA]
        		     SELECT UserID, COUNT(TargetDate) AS TargetDate, COUNT(ActualDate) AS ActualDate, SUM(CONVERT(INT, CompleteRate)) AS CompleteRate FROM #ALLTB					
			     GROUP BY UserID
					
		             SELECT B.username, F.TargetDate, F.ActualDate, (CONVERT(INT, F.CompleteRate)/F.TargetDate) AS CompletePercentage 
			     FROM #FORMULA F, dbo.gemini_users B, #ALLTB A
			     WHERE F.UserID = B.UserID AND F.UserID = A.UserID AND SUBSTRING(A.TargetDate, 7, 4) = '+@YEAR+'
					'
				
					
		SET @SQL4 = 'CREATE TABLE #FORMULA(TargetDate VARCHAR(100), ActualDate VARCHAR(100), CompleteRate VARCHAR(100))
			     INSERT [#FORMULA]
		             SELECT COUNT(TargetDate) AS TargetDate, COUNT(ActualDate) AS ActualDate, SUM(CONVERT(INT, CompleteRate)) AS CompleteRate FROM #ALLTB					
					
					
			     SELECT TargetDate, ActualDate, (CONVERT(INT, CompleteRate)/TargetDate) AS CompletePercentage 
			     FROM #FORMULA 
					'
	
	-- AND B.username = '+@DEVNAME+'	
    -- Insert statements for procedure here
	--declare @year varchar(30)
	--set @year = convert(date, GETDATE(), 103)

	--select month(@year)
    IF(@DEVNAME = '' AND @YEAR = '')
		SELECT @SQL = @SQL + @SQL4
				
    ELSE IF(@DEVNAME != '' AND @YEAR != '')
		SELECT @SQL = @SQL + ' AND B.username IN ('+@DEVNAME+')' + @SQL2 + ' AND SUBSTRING(A.TargetDate, 7, 4) = '+@YEAR+''
    
    ELSE IF(@DEVNAME != '' AND @YEAR = '')
		SELECT @SQL = @SQL + ' AND B.username IN ('+@DEVNAME+')' + @SQL2
    
    ELSE
		SELECT @SQL = @SQL + @SQL3
    
	SELECT @SQL = @SQL
	EXEC sp_executesql @SQL
END





抱歉看起来很乱。任何帮助将不胜感激。



sorry it looks messy. Any helps would be appreciated.

推荐答案

如果我正确理解你的问题,我就会这样做。

我希望你可以使用它。



This is how I would go about it, if I understood your question correctly.
I hope you can use it.

DataTable dtMonthlyResult = new DataTable();
DataColumn dcMonth = dtMonthlyResult.Columns.Add("Month", typeof(string));
DataColumn dcTarget = dtMonthlyResult.Columns.Add("TargetDate", typeof(int));
DataColumn dcActual = dtMonthlyResult.Columns.Add("ActualDate", typeof(int));
DataColumn dcComplete = dtMonthlyResult.Columns.Add("Completeness", typeof(int));
dtMonthlyResult.PrimaryKey = new DataColumn[] { dcMonth };





添加月份和初始值



Add months and initial values

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
foreach (string monthName in monthNames)
{
  dtMonthlyResult.Rows.Add(monthName.
    Substring(0, 3), 0, 0, 0);
}





从存储过程中获取数据

此部分您应该已经拥有代码



Get data from the stored procedure
This part you should have code for already

string month = "Jun";
int targetDate = 1;
int actualDate = 1;
int completeness = 80;





找到正确的行并更新



Find the correct row and update

DataRow drFound = dtMonthlyResult.Rows.Find(month);
if (drFound != null)
{
  drFound[dcTarget] = targetDate;
  drFound[dcActual] = actualDate;
  drFound[dcComplete] = completeness;
  dtMonthlyResult.AcceptChanges();
}





打印出表格



Print out the table

Console.WriteLine("Month\tTarget\tActual\tComplete");
Console.WriteLine("--------------------------------");
foreach (DataRow dr in dtMonthlyResult.Rows)
{
  Console.WriteLine("{0,3}\t{1,3}\t{2,3}\t{3,3}", 
  dr[dcMonth], dr[dcTarget], dr[dcActual], dr[dcComplete]);
}
Console.WriteLine("--------------------------------");


如果你想得到在sql本身的整个逻辑,然后用例。类似的东西 -



DECLARE @ COLVALUE1 INT,@ COLVALUE2 INT,@ COLVALUE3 INT

DECLARE @MONTH VARCHAR(50)='June'

SET @ COLVALUE1 =

CASE

WHEN @MONTH<> '六月'那么

0

ELSE

1

END

SET @ COLVALUE2 =

CASE

WHEN @MONTH<> '六月'那么

0

ELSE

1

END

SET @ COLVALUE3 =

CASE

WHEN @MONTH<> '六月'那么

0

ELSE

1

结束



INSERT INTO YOURTABLE(COL1,COL2,COL3)VALUES(@ COLVALUE1,@ COLVALUE2,@ COLVALUE3)
If you want to get the entire logic in the sql itself, then use case. Something like -

DECLARE @COLVALUE1 INT ,@COLVALUE2 INT,@COLVALUE3 INT
DECLARE @MONTH VARCHAR(50) = 'June'
SET @COLVALUE1 =
CASE
WHEN @MONTH <> 'June' THEN
0
ELSE
1
END
SET @COLVALUE2 =
CASE
WHEN @MONTH <> 'June' THEN
0
ELSE
1
END
SET @COLVALUE3 =
CASE
WHEN @MONTH <> 'June' THEN
0
ELSE
1
END

INSERT INTO YOURTABLE(COL1,COL2,COL3)VALUES(@COLVALUE1,@COLVALUE2,@COLVALUE3)


这篇关于如何在特定行中显示数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆