在这种情况下如何使用PIVOT? [英] How do I use PIVOT in this scenario ?

查看:136
本文介绍了在这种情况下如何使用PIVOT?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

伙计们我正在尝试为我的练习制作一个C#win表单应用程序,它将生成支持票据。



我的数据库中有3个表: `tblTicketDetail`,`tblEngineer`和`tblTicket_Engineer`(`Junction table`用于多对多关系,只有两列`TicketID`和`EngineerID`分别来自`tblTicketDetail`和`tblEngineer` - 制作外键)。

生成新票后,每张票都分配给三位工程师。



现在我添加了另一张表格,其中我添加了DataGridView`将显示每张票的详细信息。



这个SQL查询正在填充DataGridView:



Guys I am trying to make a C# win form application for my practice, which is going to generate support tickets.

I have 3 tables in my database : `tblTicketDetail`, `tblEngineer` and `tblTicket_Engineer` (`Junction table` for many-to-many relationship having only two columns `TicketID` and `EngineerID` from `tblTicketDetail` and `tblEngineer` respectively- making foreign keys).
Upon generating a new ticket, each ticket is assigned to three engineers.

Now I have added another form in which I have added `DataGridView` which is going show each ticket's detail.

DataGridView is being populated by this SQL query :

SELECT dbo.tblTicketDetail.TicketID, dbo.tblTicketDetail.IssuerName,
dbo.tblEngineer.Name FROM  dbo.tblTicketDetail
INNER JOIN dbo.tblTicket_Engineer
ON dbo.tblTicketDetail.TicketID = dbo.tblTicket_Engineer.TicketID
INNER JOIN dbo.tblEngineer
ON dbo.tblTicket_Engineer.EngineerID = dbo.tblEngineer.EngineerID
WHERE (dbo.tblTicket_Engineer.TicketID = 1)";





现在我已经分配了1到3名工程师,所以`大taGridView`显示3行,每行有不同的工程师名称。哪个没关系,但我想要做的是,在`DataGridView`中添加3列,如`Engineer 1`,`Engineer 2`和`Engineer 3`,并用Engineer的名称填充它们,而不是显示3个不同的行(即每张票应该有一排)。现在我似乎无法弄清楚如何做到这一点。所以任何帮助都表示赞赏。



页码:





Now as I have assigned Ticket # 1 to 3 engineers, so the `DataGridView` shows up with 3 rows each having different engineer name. Which is okay but what i want to do is, Add 3 columns in `DataGridView` like `Engineer 1`, `Engineer 2` and `Engineer 3` and populate them with Engineer's name instead of showing 3 different rows (i.e. Each ticket should have one row). Now I can't seem to figure out how to do this. So any help is appreciated.

Page Code :

string strCon = ConfigurationManager.ConnectionStrings["ST"].
ConnectionString.ToString();
string strSQL = "//query mentioned above";
SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strCon);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource1.DataSource = table;
dataGridView1.ReadOnly = true;
dataGridView1.DataSource = bindingSource1;





图片供参考:



这是怎么回事上述查询返回结果:

http://i.stack.imgur.com/Cqemd。 png [ ^ ]



这就是我想要的结果(来自另一个包含所有这些列的表的图片):

http://i.stack.imgur.com/rFHJL.png [ ^ ]



注意:每张票总共有3名工程师。他们的名字可能会改变,但总会有三名工程师。



Pictures for reference :

This is how the above query returns result :
http://i.stack.imgur.com/Cqemd.png[^]

This is how I want the result to be (picture from another table which has all these columns) :
http://i.stack.imgur.com/rFHJL.png[^]

Note : Each ticket will ALWAYS have 3 engineers. Their names may change but there will always be three engineers.

推荐答案

看看例子:



Have a look at example:

--TD
CREATE TABLE #tblTicketDetail
(
	TicketID INT,
	IssuerName NVARCHAR(30),
	TicketDescription NVARCHAR(30)
)


--EN
CREATE TABLE #tblEngineer
(
	EngineerID INT IDENTITY(1,1),
	[Name] NVARCHAR(30)
)

--TE
CREATE TABLE #tblTicket_Engineer
(
	TicketID INT,
	EngineerID INT
)


INSERT INTO #tblTicketDetail (TicketID, IssuerName, TicketDescription)
VALUES(1, 'Saqib', 'qwerty keyboard')

INSERT INTO #tblEngineer ([Name])
VALUES('Imran Khan'), ('Mubeen Khan'), ('Faraz Ahmed')

INSERT INTO #tblTicket_Engineer (TicketID, EngineerID)
VALUES(1,1),(1,2),(1,3)

SELECT  TicketID, IssuerName, TicketDescription, [1], [2], [3]
FROM (
	SELECT TD.TicketID, TD.IssuerName, TD.TicketDescription, ROW_NUMBER() OVER(ORDER BY TE.EngineerID) AS EngineerNo, EN.[Name]
	FROM  #tblTicketDetail AS TD
		INNER JOIN #tblTicket_Engineer AS TE ON TD.TicketID = TE.TicketID 
		INNER JOIN #tblEngineer AS EN ON TE.EngineerID = EN.EngineerID 
	WHERE (TE.TicketID = 1)
) AS DT
PIVOT(MAX([Name]) FOR [EngineerNo] IN([1], [2], [3])) AS PT

DROP TABLE #tblTicketDetail
DROP TABLE #tblEngineer
DROP TABLE #tblTicket_Engineer





结果:



Result:

Tic..ID Issu... TicketDesc...   1               2               3
1	Saqib	qwerty keyboard	Imran Khan	Mubeen Khan	Faraz Ahmed


这篇关于在这种情况下如何使用PIVOT?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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