本文介绍了如何使用SQL在列中获取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,这里所有开发人员的好日子

我想知道如何从不同行的表中获取数据和

在列中显示数据



我有一张包含以下字段的表格。

Hi Good day to all developers here
I want to know how to get data from table that are in different Rows and
Show that data in Columns

I have a table with following fields.

Name	Date	        TimeCL	               Detail
Rashid Ali	2017-12-05	09:22:56.0000000	IN
Rashid Ali	2017-12-05	10:14:33.0000000	OUT
Rashid Ali	2017-12-14	09:00:45.0000000	IN
Rashid Ali	2017-12-14	14:08:53.0000000	OUT





我希望得到这样的数据。



and I Want to Get Data Like This.

Name	Date	        Time IN                 Time Out
Rashid Ali	2017-12-05	09:22:56.0000000      10:14:33.0000000	
Rashid Ali	2017-12-14	09:00:45.0000000      14:08:53.0000000





任何人都可以帮我一个好的开始



谢谢



我尝试过:



我试试这但它给我错误的数据





Can anyone give me a hand for me to have a good start

Thanks

What I have tried:

I try This But It Give me wrong Data

引用:

SELECT Std_InfoTB.Name,AttendanceTb.Date,AttendanceTb.TimeCL,AttendanceTb_1.TimeCL AS Expr1

FROM Std_InfoTB INNER JOIN

AttendanceTb ON Std_InfoTB.Std_ID = AttendanceTb.Std_ID INNER JOIN

AttendanceTb AS AttendanceTb_1 ON Std_InfoTB.Std_ID = AttendanceTb_1.Std_ID

WHERE(AttendanceTb。 Std_ID = 21)AND(MONTH(AttendanceTb.Date)= 12)AND(YEAR(AttendanceTb.Date)= 2017)AND(AttendanceTb.Detail = N'IN')AND

(AttendanceTb_1.Detail = N'OUT')

SELECT Std_InfoTB.Name, AttendanceTb.Date, AttendanceTb.TimeCL, AttendanceTb_1.TimeCL AS Expr1
FROM Std_InfoTB INNER JOIN
AttendanceTb ON Std_InfoTB.Std_ID = AttendanceTb.Std_ID INNER JOIN
AttendanceTb AS AttendanceTb_1 ON Std_InfoTB.Std_ID = AttendanceTb_1.Std_ID
WHERE (AttendanceTb.Std_ID = 21) AND (MONTH(AttendanceTb.Date) = 12) AND (YEAR(AttendanceTb.Date) = 2017) AND (AttendanceTb.Detail = N'IN') AND
(AttendanceTb_1.Detail = N'OUT')

推荐答案


CREATE TABLE #Temp(Name Varchar(50),Dts Date,TimeCL Time,Detail varchar(20));

INSERT INTO #TEMP 
                 VALUES('Rashid Ali','2017-12-05','09:22:56.0000000','IN'),
                       ('Rashid Ali','2017-12-05','10:14:33.0000000','OUT'),
                       ('Rashid Ali','2017-12-14','09:00:45.0000000','IN'),
                       ('Rashid Ali','2017-12-14','14:08:53.0000000','OUT');
                 
SELECT Name,
       Dts,
	   MAX(CASE WHEN Detail='IN' THEN TIMECl END) AS TimeIN,
	   MAX(CASE WHEN Detail='out' THEN TIMECl END) AS TimeOut 
  FROM #Temp GROUP BY Name,Dts;

OUTPUT:-
----------------------------------------------------------
 Name	       Dts	     TimeIN	           TimeOut
 -------------------------------------------------------------
Rashid Ali	2017-12-05	09:22:56.0000000	10:14:33.0000000
Rashid Ali	2017-12-14	09:00:45.0000000	14:08:53.0000000


This is a simple Pivot solution. There is an excellent article at:
https://www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query





不要将日期和时间分成不同的列,这是不好的做法。除此之外,这是一个简单的解决方案:



Don't split the date and time into separate columns, it is bad practice. Other than that, here is a simple solution:

DECLARE @T TABLE(
	Atd_ID	int,
	Std_ID int,
	transDate date,
	Detail nvarchar(10),
	TimeCL time,
	MessageIN bit,
	MessageOut bit
)

INSERT INTO @T VALUES
(88,21,'2017-12-04','OUT','13:55:02.0000000',0,1),
(93,21,'2017-12-05','IN','09:22:56.0000000',1,0),
(96,21,'2017-12-05','OUT','10:14:33.0000000',0,1),
(98,21,'2017-12-14','IN','09:00:45.0000000',1,0),
(106,21,'2017-12-14','OUT','14:08:53.0000000',0,1),
(114,21,'2017-12-15','IN','09:30:48.0000000',1,0),
(115,21,'2017-12-15','OUT','10:03:14.0000000',0,1),
(125,21,'2017-12-16','IN','09:34:05.0000000',1,0),
(127,21,'2017-12-16','OUT','11:46:00.0000000',0,1),
(128,21,'2017-12-18','IN','08:53:55.0000000',1,0),
(137,21,'2017-12-18','OUT','14:18:11.0000000',0,1),
(142,21,'2017-12-19','IN','08:51:36.0000000',1,0),
(147,21,'2017-12-19','OUT','14:00:18.0000000',0,1),
(152,21,'2017-12-20','IN','09:10:32.0000000',1,0),
(156,21,'2017-12-20','OUT','13:10:52.0000000',0,1),
(164,21,'2017-12-21','IN','09:11:22.0000000',1,0);

SELECT * FROM 
(SELECT Std_ID, transDate, MessageIN, TimeCL  FROM @T)
AS s
PIVOT
(
	MAX(TimeCL)
	FOR MessageIN IN ([1],[0])
) AS p





您的结果将如下所示:



Your results will look like this:

Std_ID	transDate	1	0
21	2017-12-04	NULL	13:55:02.0000000
21	2017-12-05	09:22:56.0000000	10:14:33.0000000
21	2017-12-14	09:00:45.0000000	14:08:53.0000000
21	2017-12-15	09:30:48.0000000	10:03:14.0000000
21	2017-12-16	09:34:05.0000000	11:46:00.0000000
21	2017-12-18	08:53:55.0000000	14:18:11.0000000
21	2017-12-19	08:51:36.0000000	14:00:18.0000000
21	2017-12-20	09:10:32.0000000	13:10:52.0000000
21	2017-12-21	09:11:22.0000000	NULL





我希望这符合您的要求。



I hope this meets your requirements.


这篇关于如何使用SQL在列中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 00:11