 |
|
การเรียกใช้งาน sql pivot ถ้าต้องการจะดูข้อมูลที่กว่านี้ (ข้อมูลข้างในครับ) จะทำอย่างไรได้บ้างครับ |
|
 |
|
|
 |
 |
|
ตอนนี้ผมใช้ sql pivot ประมาณนี้ครับ
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:02')
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:50')
INSERT INTO @Big VALUES ('Jim','2013-09-02','08:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jim','2013-09-03','08:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:02')
SELECT *
FROM @Big
Pivot(Min(Time_Conv) FOR Date_Conv IN (
[2013-09-01],
[2013-09-02],
[2013-09-03]
)) AS Pvt1
UNION ALL
SELECT *
FROM @Big
Pivot(Max(Time_Conv) FOR Date_Conv IN (
[2013-09-01],
[2013-09-02],
[2013-09-03]
)) AS Pvt2
จากโค๊ตจะเห็นได้ว่า
Pvt1 จะหาค่าเวลาต่ำสุด (Min(Time_Conv))
Pvt2 จะหาค่าเวลาสูงสุด (Max(Time_Conv))
ผลคือมันจะได้ข้อมูลออกมาแค่ 2 บรรทัดครับ คือ ต่ำสุด และสูงสุด
ถ้าในกรณีที่เวลาใน Date_Conv นั้น ๆ (วันนั้น ๆ) มีข้อมูลเวลามากกว่า 2 ตัว เช่น 08:02, 16.00, 16.30 จะทำอย่างไรให้สามารถคิวรี่ออกมาได้ทั้งหมด (ของแต่ละวันครับ) จะทำอย่างไรได้บ้าง เพราะเท่าที่ศึกษาดูหลาย ๆ เว็บอ่ะครับ SQL Pivot ต้องให้ใส่ฟังก์ชันอย่างน้อย 1 อัน ถ้าเป็นแบบนี้เราจะทำอย่างไรได้บ้างครับ ขอบคุณครับ
Tag : .NET, Ms SQL Server 2012, VB.NET
|
|
 |
 |
 |
 |
Date :
2013-09-09 15:08:45 |
By :
golfkub |
View :
4278 |
Reply :
14 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:02')
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:50')
INSERT INTO @Big VALUES ('Jim','2013-09-02','08:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jim','2013-09-03','08:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:02')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:03')
SELECT
Date_Conv AS [Date],
Min(Time_Conv) AS [Min],
Max(Time_Conv) AS [Max]
FROM
@big
GROUP BY
Date_Conv
|
 |
 |
 |
 |
Date :
2013-09-09 15:26:21 |
By :
คนงานตัดอ้อย |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
มันยังได้ออกมา 2 ค่าเหมือนเดิมอ่ะครับ   
|
 |
 |
 |
 |
Date :
2013-09-10 09:12:53 |
By :
golfkub |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วต้องการผลแบบไหนครับ ขอลองเป็นรูปก็ยังดีจินตนาการไม่ออก
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
-- Day 1
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:00')
INSERT INTO @Big VALUES ('Jim','2013-09-01','09:02')
INSERT INTO @Big VALUES ('Jim','2013-09-01','12:30')
INSERT INTO @Big VALUES ('Jim','2013-09-01','14:52')
INSERT INTO @Big VALUES ('Jim','2013-09-01','15:04')
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:50')
-- Day 2
INSERT INTO @Big VALUES ('Jim','2013-09-02','07:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','11:05')
INSERT INTO @Big VALUES ('Jim','2013-09-02','19:25')
INSERT INTO @Big VALUES ('Jim','2013-09-02','21:25')
INSERT INTO @Big VALUES ('Jim','2013-09-02','01:00')
INSERT INTO @Big VALUES ('Jim','2013-09-02','00:01')
-- Day 3
INSERT INTO @Big VALUES ('Jim','2013-09-03','06:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','09:02')
INSERT INTO @Big VALUES ('Jim','2013-09-03','10:53')
INSERT INTO @Big VALUES ('Jim','2013-09-03','12:03')
INSERT INTO @Big VALUES ('Jim','2013-09-03','14:35')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:03')
SELECT
Date_Conv AS [Date],
Min(Time_Conv) AS [Min],
Max(Time_Conv) AS [Max]
FROM
@big
GROUP BY
Date_Conv

|
 |
 |
 |
 |
Date :
2013-09-10 09:21:19 |
By :
คนงานตัดอ้อย |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
#NO xxx หน้าชื่นอกตรม
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:02') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:00') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:30') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-02','08:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jim','2013-09-03','08:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:02')
;WITH DeepAss AS (
SELECT ROW_NUMBER() OVER(PARTITION BY Fullname, Date_Conv ORDER BY Time_Conv) AS Sideline, *
FROM @Big
)
SELECT * FROM DeepAss
PIVOT(MIN(time_conv) FOR Date_Conv IN (
[2013-09-01],
[2013-09-02],
[2013-09-03]
)) AS Pvt1
[x] นึกว่าโปรแกรมเลิกใช้งานไปแล้ว
|
 |
 |
 |
 |
Date :
2013-09-10 12:29:25 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตั้ง 2 กระทู้ แต่เป็นเรื่องเดียวกัน ด้วยคนฯเดียวกัน แต่ไม่ได้มีข้อสรุปที่ชัดเจน
(ทั้ง 2 กระทู้ ผมเข้าใจในสิ่งที่คุณคิด/ต้องการ และในทางกลับกัน)
อันนี้เป็นบทสรุป (ผมเก็บเอาไว้อ้างอิง) เรื่อง Pivot Table & Dynamic Pivot Table
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
DECLARE @ColsPivot AS NVARCHAR(MAX)
DECLARE @Query AS NVARCHAR(MAX)
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:02') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:00') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:30') --*****
INSERT INTO @Big VALUES ('Jim','2013-09-02','08:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jim','2013-09-03','08:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:02')
IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable;
SELECT @colsPivot = STUFF((
SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(8), Date_Conv, 112))
FROM @Big
FOR XML PATH(''),
TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @Query = 'SELECT * FROM #TempTable
PIVOT(MIN(Time_Conv) FOR Date_Conv IN (' + @colsPivot + '))
AS Pvt1';
WITH DeepAss
AS (
SELECT ROW_NUMBER() OVER (
PARTITION BY FullName,
Date_Conv ORDER BY Time_Conv ASC
) AS Sideline,
*
FROM @Big
)
SELECT * INTO #TempTable FROM DeepAss
EXECUTE (@query)
--IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable;
GoodLuck
[x] ศึกษาเพิ่มเติมครับ Select Distinct VS Group By
|
 |
 |
 |
 |
Date :
2013-09-12 07:36:37 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
#NO 5 บรรทัดที่ 32 แก้ไขเป็น ;WITH DeepAss
(Config SQL Server แตกต่างกัน)
|
 |
 |
 |
 |
Date :
2013-09-12 07:55:43 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รบกวนสอบถามอีกนิดนึงครับ พอดีผมได้ลองนำโค๊ตไปใช้แล้ว พอเวลา ค้นหาข้อมูลตามช่วงเวลาอ่ะครับ
จากโค๊ตนี้คือ หาเวลาระหว่างวันที่ 3-5 ก.ย. 2013 ดังโค๊ตครับ
Code (SQL)
DECLARE @Big TABLE (
FullName VARCHAR(255),
Date_Conv DATETIME,
Time_Conv VARCHAR(5)
)
DECLARE @ColsPivot AS NVARCHAR(MAX)
DECLARE @Query AS NVARCHAR(MAX)
INSERT INTO @Big VALUES ('Jim','2013-09-01','08:02')
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:00')
INSERT INTO @Big VALUES ('Jim','2013-09-01','16:30')
INSERT INTO @Big VALUES ('Jim','2013-09-02','08:04')
INSERT INTO @Big VALUES ('Jim','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jim','2013-09-03','08:29')
INSERT INTO @Big VALUES ('Jim','2013-09-03','16:02')
INSERT INTO @Big VALUES ('Jame','2013-09-01','08:02')
INSERT INTO @Big VALUES ('Jame','2013-09-01','16:00')
INSERT INTO @Big VALUES ('Jame','2013-09-02','16:30')
INSERT INTO @Big VALUES ('Jame','2013-09-04','08:04')
INSERT INTO @Big VALUES ('Jame','2013-09-02','16:25')
INSERT INTO @Big VALUES ('Jame','2013-09-04','08:29')
INSERT INTO @Big VALUES ('Jame','2013-09-04','16:02')
INSERT INTO @Big VALUES ('TestOne','2013-09-05','08:02')
INSERT INTO @Big VALUES ('TestOne','2013-09-05','16:00')
INSERT INTO @Big VALUES ('TestOne','2013-09-05','16:30')
INSERT INTO @Big VALUES ('TestOne','2013-09-06','08:04')
INSERT INTO @Big VALUES ('TestOne','2013-09-06','16:25')
INSERT INTO @Big VALUES ('TestOne','2013-09-07','08:29')
INSERT INTO @Big VALUES ('TestOne','2013-09-07','16:02')
IF OBJECT_ID(N'tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable;
SELECT @colsPivot = STUFF((
SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(10), Date_Conv, 120))
FROM @Big
FOR XML PATH(''),
TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @Query = 'SELECT * FROM #TempTable
PIVOT(MIN(Time_Conv) FOR Date_Conv IN (' + @colsPivot + '))
AS Pvt1';
WITH DeepAss AS (
SELECT ROW_NUMBER() OVER (PARTITION BY FullName,Date_Conv ORDER BY Time_Conv ASC) AS Sideline,
* FROM @Big
WHERE Date_Conv BETWEEN '2013-09-03' AND '2013-09-05')
SELECT * INTO #TempTable FROM DeepAss
EXECUTE (@query)
DROP TABLE #TempTable;
แต่ผลที่ออกมาคือ มันมีคอลัมน์วันที่ ที่ไม่ได้อยู่ในเงื่อนไข (BETWEEN) แสดงออกมากด้วยครับ คือมันจะแสดงทั้งหมดของวันที่ที่มีในฐานข้อมูล แต่จะแสดงเป็นค่า NULL ไว้ครับ เราจะให้แสดงเฉพาะคอลัมน์วนที่ที่เราค้นหาได้อย่างไรครับ ขอบคุณครับ
มันออกมาแบบนี้ครับ

|
 |
 |
 |
 |
Date :
2013-09-13 10:45:37 |
By :
golf |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เพิ่มเงื่อนไข บรรทัดที่ 37 - 42
Code (SQL)
SELECT @colsPivot = STUFF((
SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(8), Date_Conv, 112))
FROM @Big WHERE Date_Conv BETWEEN '2013-09-03' AND '2013-09-05'
FOR XML PATH(''),
TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
|
 |
 |
 |
 |
Date :
2013-09-13 11:06:13 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หัวข้อกระทู้ที่ 100363 ผมจนปัญญา
|
 |
 |
 |
 |
Date :
2013-09-13 11:14:38 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอนนี้ได้แล้วครับ จะรบกวนถามอะไรอีกซักข้อได้ไหมครับ ในกรณีของเวลา (ที่เอามาโชว์ในแต่ละวัน)
ถ้าเราจะเอาอีกคอลัมน์นึงที่เป็นตัวอักษร (I และ O) มาแสดงคู่กับเวลา ในรูปแบบของ 08:00 (I) , 16:00 (O) แบบนี้จะทำได้ไหมครับ
ขอบคุณครับ
|
 |
 |
 |
 |
Date :
2013-09-13 16:04:12 |
By :
golfkub |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
SET @Query = 'SELECT * FROM #TempTable
PIVOT(MIN(Time_ConvXXX) FOR Date_Conv IN (' + @colsPivot + '))
AS Pvt1';
;WITH DeepAss
AS (
SELECT ROW_NUMBER() OVER (
PARTITION BY FullName,
Date_Conv ORDER BY Time_Conv ASC
) AS Sideline,
*, (SELECT CASE WHEN Time_Conv <= '12:00' THEN Time_Conv + '(I)' ELSE 'Ass (O)' END) As Time_ConvXXX
FROM @Big
)
|
 |
 |
 |
 |
Date :
2013-09-13 18:20:29 |
By :
ผ่านมา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ 
|
 |
 |
 |
 |
Date :
2013-09-16 08:27:43 |
By :
golfkub |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|