50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

نمایش ستونها بصورت یک سطر

سلام

فرض کنید یک جدول داریم که چهار ستون نام ,ساعت ورود و ساعت خروج و تاریخ می باشد

وبرای هر نفر در هر ماه 30الی150بار اطلاعات ثبت کرده ایم

حال من می خواهم

بصورت یک سطر نمایش بدهم

بصورت ذیل

نام تاریخ1 ساعت ورود وساعت خروج تاریخ 2 ساعت وردو ساعت خروج همینطورتاتاریخ30ام را بیاورد نمایش بدهد

پرسیده شده در 1395/05/27 توسط

4 پاسخ

1

دوست عزیز خط آخرت رو متوجه نمیشم و درثانی کجا داری این عملیات رو انجام میدی ؟ sql، اکسل ، اکسس یا ...؟

پاسخ در 1395/05/27 توسط
1

سلام

بهترین روش استفاده از pivot است

برای مثال شما جواب رو میگذارم

امیدوارم به دردتون بخوره


DECLARE @names AS NVARCHAR(Max)
DECLARE @Pivot AS NVARCHAR(MAX)
;WITH cte AS 
(
    SELECT DISTINCT name
    FROM test3
)
SELECT @names = ISNULL(@names + ', ' ,'') + '[' + Name + ']'
FROM cte

SET @Pivot =
'
select *
from 
(
  select Date, Name, Price
  from test3
) src
pivot
(
  sum(price)
  for Name in (' + @names + ' )
) piv;
'
EXEC(@Pivot)


اگر درست نمایش داده نشد، یه ایمیل بزنید تا براتون بفرستم :

hmd.tz1988@gmail.com

پاسخ در 1395/06/09 توسط
0

سلام

فرض کنید جدول زیر را داریم


CREATE TABLE [dbo].[test3](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Date] [date] NULL,
	[Name] [nvarchar](50) NULL,
	[Price] [int] NULL,
 CONSTRAINT [PK_test3] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

و داده های زیر را داخل ان وارد کرده ایم

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۱','a',۱۰۰)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۲','a',۱۰۱)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۳','a',۱۰۲)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۱','b',۱۰۳)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۲','b',۱۰۴)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۳','b',۱۰۵)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۱','c',۱۰۶)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۲','c',۱۰۷)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۳','c',۱۰۸)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۱','d',۱۰۹)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۲','d',۱۱۰)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۳','d',۱۱۱)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۱','e',۱۱۲)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۲','e',۱۱۳)

insert into [dbo].[test۳] values('۲۰۱۶-۰۵-۰۳','e',۱۱۴)

حال من کوئری می خواهم که جواب زیر را به من برگرداند

Date	a	b	c	d	e

۲۰۱۶-۰۵-۰۱	۱۰۰	۱۰۳	۱۰۶	۱۰۹	۱۱۲

۲۰۱۶-۰۵-۰۲	۱۰۱	۱۰۴	۱۰۷	۱۱۰	۱۱۳

۲۰۱۶-۰۵-۰۳	۱۰۲	۱۰۵	۱۰۸	۱۱۱	۱۱۴

بدین صورت که به تعداد روزها سطر ایجاد شود و به تعداد داده های ستون name برای خروچی ستون ایجاد شود و قیمتهای مربوط زیر هر نام براساس ان تاریخ نمایش داده شود

درضمن تعداد داده های ستون name متغییر است وتعداد ثابتی ندارد

چگونه من باید کوئری بنویسم تا به جواب مورد نظرم برسم

باتشکر

پاسخ در 1395/05/27 توسط
1

سلام

شما ميتوانيد از Recursive CTE استفاده كنيد.

CREATE TABLE #t
(ID INT IDENTITY,Name VARCHAR(20),EnterTime TIME,ExitTime TIME,DoneDate DATE)

INSERT INTO #t
        ( Name, EnterTime, ExitTime, DoneDate )
VALUES  ( 'test1', -- Name - varchar(20)
          GETDATE(), -- EnterTime - time
          GETDATE(), -- ExitTime - time
          GETDATE()  -- DoneDate - date
          ),
		  ( 'test2', -- Name - varchar(20)
          GETDATE(), -- EnterTime - time
          GETDATE(), -- ExitTime - time
          GETDATE()  -- DoneDate - date
          ),
		  ( 'test3', -- Name - varchar(20)
          GETDATE(), -- EnterTime - time
          GETDATE(), -- ExitTime - time
          GETDATE()  -- DoneDate - date
          )

;WITH CTE1 AS
(
SELECT  * ,ROW_NUMBER() OVER(ORDER BY ID) AS level,Name+'------'+CAST(EnterTime AS VARCHAR(30))+'-----'+CAST(ExitTime AS VARCHAR(30))+'-----'+CAST(DoneDate AS VARCHAR(30)) Res
FROM #t
)
,CTE2
AS
(
SELECT TOP 1 level,CAST(CTE1.Res AS VARCHAR(max)) res
FROM CTE1
UNION ALL
SELECT CTE1.level,CAST(CTE2.res+'****'+cte1.Res AS VARCHAR(max))
FROM CTE1 INNER JOIN cte2 ON CTE2.level+1 = CTE1.level

)
SELECT * 
FROM CTE2
WHERE CTE2.level =(SELECT MAX(CTE2.level) FROM CTE2)
DROP TABLE #t
پاسخ در 1395/05/30 توسط

پاسخ شما