กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
Moderator: mindphp
-
- PHP Newbie
- โพสต์: 5
- ลงทะเบียนเมื่อ: 26/06/2010 1:05 pm
กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
รบกวนพี่ๆช่วยหาวิธี query ในกรณีนี้ทีครับ (SQL Server Management Studio)
มีตาราง Table1
ID Type_ Color
1 A RED
2 A RED
3 B RED
4 C BLUE
5 D GREEN
นำมา query ให้แสดงเป็น
Type_ RED BLUE GREEN
A 2 0 0
B 1 0 0
C 0 1 0
D 0 0 1
โดยที่ใน Table1 สามารถใส่ type ได้ไม่จำกัด และสามารถมีสีได้ไม่จำกัดโดยเมื่อเพิ่มใน Table1 แล้ว ที่ query ก็จะมีสีเพิ่มตามนั้นด้วย
ผมจนปัญญาในการแก้โจทย์นี้จริงๆครับ รบกวนพี่ๆที่มีความสามารถช่วยทีครับ
ตอนนี้ผมทำได้แค่ query ได้เมื่อเพิ่ม Type_ เข้ามาแต่จะให้เพิ่มสีด้วยยังคิดไม่ออกเลยครับ
SELECT Type_,
sum(CASE Color WHEN 'RED' THEN 1 ELSE 0 END) RED ,
sum(CASE Color WHEN 'BLUE' THEN 1 ELSE 0 END) BLUE ,
sum(CASE Color WHEN 'GREEN' THEN 1 ELSE 0 END) GREEN
FROM Table1
GROUP BY Type_
ปล.คิดว่าต้องใช้ pivot แต่ใช้ไม่เป็นครับ
มีตาราง Table1
ID Type_ Color
1 A RED
2 A RED
3 B RED
4 C BLUE
5 D GREEN
นำมา query ให้แสดงเป็น
Type_ RED BLUE GREEN
A 2 0 0
B 1 0 0
C 0 1 0
D 0 0 1
โดยที่ใน Table1 สามารถใส่ type ได้ไม่จำกัด และสามารถมีสีได้ไม่จำกัดโดยเมื่อเพิ่มใน Table1 แล้ว ที่ query ก็จะมีสีเพิ่มตามนั้นด้วย
ผมจนปัญญาในการแก้โจทย์นี้จริงๆครับ รบกวนพี่ๆที่มีความสามารถช่วยทีครับ
ตอนนี้ผมทำได้แค่ query ได้เมื่อเพิ่ม Type_ เข้ามาแต่จะให้เพิ่มสีด้วยยังคิดไม่ออกเลยครับ
SELECT Type_,
sum(CASE Color WHEN 'RED' THEN 1 ELSE 0 END) RED ,
sum(CASE Color WHEN 'BLUE' THEN 1 ELSE 0 END) BLUE ,
sum(CASE Color WHEN 'GREEN' THEN 1 ELSE 0 END) GREEN
FROM Table1
GROUP BY Type_
ปล.คิดว่าต้องใช้ pivot แต่ใช้ไม่เป็นครับ
- imsn
- PHP Super Member
- โพสต์: 375
- ลงทะเบียนเมื่อ: 07/05/2010 12:58 pm
- ติดต่อ:
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
query สองครั้งก็ได้ครับ
ครั้งแรก เอา ชื่อสีมาทั้งหมด
แล้วใส่ ใน CASE ... เอา
ครั้งแรก เอา ชื่อสีมาทั้งหมด
แล้วใส่ ใน CASE ... เอา
ช่วยตอบเพราะอยากโปรโหมทเว็บ คิคิคลิกเลย
หาเพื่อนฝรั่งคุย M ...
หาเพื่อนฝรั่งคุย M ...
-
- PHP Newbie
- โพสต์: 5
- ลงทะเบียนเมื่อ: 26/06/2010 1:05 pm
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
รบกวนบอกทีว่าเขียนอย่างไรดีครับ ถ้า query ชื่อสีทั้งหมดมาแล้วจะมาใส่ในชื่อสี
sum(CASE Color WHEN 'ชื่อสี' THEN 1 ELSE 0 END) ชื่อสี
ต้องเขียนอย่างไรครับเรื่อง dynamic นี่ผมไม่รู้เรื่องเลยครับ
sum(CASE Color WHEN 'ชื่อสี' THEN 1 ELSE 0 END) ชื่อสี
ต้องเขียนอย่างไรครับเรื่อง dynamic นี่ผมไม่รู้เรื่องเลยครับ
- imsn
- PHP Super Member
- โพสต์: 375
- ลงทะเบียนเมื่อ: 07/05/2010 12:58 pm
- ติดต่อ:
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
ใช้ Mssql กับ php หรือเปล่าครับ
ช่วยตอบเพราะอยากโปรโหมทเว็บ คิคิคลิกเลย
หาเพื่อนฝรั่งคุย M ...
หาเพื่อนฝรั่งคุย M ...
-
- PHP Newbie
- โพสต์: 5
- ลงทะเบียนเมื่อ: 26/06/2010 1:05 pm
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
ใช้ Mssql ครับ
ตอนนี้แก้ปัญหาได้แล้วครับ
ใช้ DECLARE @string VARCHAR(MAX) เอาครับ
แล้วทำเป็น Dynamic Pivot
ตอนนี้แก้ปัญหาได้แล้วครับ
ใช้ DECLARE @string VARCHAR(MAX) เอาครับ
แล้วทำเป็น Dynamic Pivot
- imsn
- PHP Super Member
- โพสต์: 375
- ลงทะเบียนเมื่อ: 07/05/2010 12:58 pm
- ติดต่อ:
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
เขียนไปไงครับ แชร์กันหน่อย
ช่วยตอบเพราะอยากโปรโหมทเว็บ คิคิคลิกเลย
หาเพื่อนฝรั่งคุย M ...
หาเพื่อนฝรั่งคุย M ...
-
- PHP Newbie
- โพสต์: 5
- ลงทะเบียนเมื่อ: 26/06/2010 1:05 pm
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
DECLARE @SQLCMD VARCHAR(MAX)
IF OBJECT_ID('View2') IS NOT NULL
BEGIN
DROP VIEW View2
END
SET @SQLCMD = 'CREATE VIEW View2 AS
SELECT DISTINCT Color
FROM Table1'
EXECUTE(@SQLCMD)
DECLARE @PivotColumnHeaders VARCHAR(MAX)
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast(Color as varchar) + ']',
'[' + cast(Color as varchar)+ ']'
)
FROM View2
IF OBJECT_ID('View3') IS NOT NULL
BEGIN
DROP VIEW View3
END
SET @SQLCMD = '
CREATE VIEW View3 AS SELECT Type_,'+ @PivotColumnHeaders +' FROM Table1
PIVOT (COUNT(Color)
FOR Color IN('+ @PivotColumnHeaders +'))
AS P'
EXECUTE(@SQLCMD)
DECLARE @test VARCHAR(MAX)
SELECT @test =
COALESCE(
@test + ',SUM(' + cast(Color as varchar) + ') ' + cast(Color as varchar),
'SUM(' + cast(Color as varchar)+ ') ' + cast(Color as varchar)
)
FROM View2
SET @SQLCMD = '
SELECT Type_,'+ @test +' FROM View3
GROUP BY Type_'
EXECUTE(@SQLCMD)
IF OBJECT_ID('View2') IS NOT NULL
BEGIN
DROP VIEW View2
END
SET @SQLCMD = 'CREATE VIEW View2 AS
SELECT DISTINCT Color
FROM Table1'
EXECUTE(@SQLCMD)
DECLARE @PivotColumnHeaders VARCHAR(MAX)
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast(Color as varchar) + ']',
'[' + cast(Color as varchar)+ ']'
)
FROM View2
IF OBJECT_ID('View3') IS NOT NULL
BEGIN
DROP VIEW View3
END
SET @SQLCMD = '
CREATE VIEW View3 AS SELECT Type_,'+ @PivotColumnHeaders +' FROM Table1
PIVOT (COUNT(Color)
FOR Color IN('+ @PivotColumnHeaders +'))
AS P'
EXECUTE(@SQLCMD)
DECLARE @test VARCHAR(MAX)
SELECT @test =
COALESCE(
@test + ',SUM(' + cast(Color as varchar) + ') ' + cast(Color as varchar),
'SUM(' + cast(Color as varchar)+ ') ' + cast(Color as varchar)
)
FROM View2
SET @SQLCMD = '
SELECT Type_,'+ @test +' FROM View3
GROUP BY Type_'
EXECUTE(@SQLCMD)
-
- PHP Newbie
- โพสต์: 5
- ลงทะเบียนเมื่อ: 26/06/2010 1:05 pm
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
ถ้าท่านใดมีวิธีที่ง่ายกว่านี้รบกวนบอกทีนะครับ
- nungs
- PHP Jr. Member
- โพสต์: 23
- ลงทะเบียนเมื่อ: 01/01/1970 7:00 am
- ติดต่อ:
Re: กูรู SQL ช่วยทีครับ(query case ซับซ้อน)
query table with dist type -> ได้ type
query type -> สี
query type -> สี
ผู้ใช้งานขณะนี้
สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 75