กระทู้เก่าบอร์ด อ.Yeadram
        
           4,628   22		  
          
					  
		    URL.หัวข้อ / 
		    URL
        
        RunningSum CrosstabQuery      
    
      ข้อมูลผมเป็นแบบนี้
เดือน จำนวน
10 500
10 600
11 1500
12 750
1 450
1 350
พอทำ CrosstabQuery จะได้แบบนี้
เดือน >> 10 11 12 1 2............9
1100 1500 750 800 0
ที่อยากได้คือ ให้ข้อมูลมันรวมไปในแต่ละเดือน
เดือน >> 10 11 12 1 2............9
1100 2600 3350 4150 4150
มันแนวทางการทำอย่างไรได้บ้างครับ เช่นไปกำหนดที่ คุณสมบัติ ตรงไหนได้ หรือใช้สูตรอะไร ฟังชันอะไรครับ
    
  เดือน จำนวน
10 500
10 600
11 1500
12 750
1 450
1 350
พอทำ CrosstabQuery จะได้แบบนี้
เดือน >> 10 11 12 1 2............9
1100 1500 750 800 0
ที่อยากได้คือ ให้ข้อมูลมันรวมไปในแต่ละเดือน
เดือน >> 10 11 12 1 2............9
1100 2600 3350 4150 4150
มันแนวทางการทำอย่างไรได้บ้างครับ เช่นไปกำหนดที่ คุณสมบัติ ตรงไหนได้ หรือใช้สูตรอะไร ฟังชันอะไรครับ
				22 Reply in this Topic. Dispaly 2  pages and you are on page number 1 
				
        
    2 @R12711    
        
  
      แก้ไข
select distinct t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where t2.[เดือน] >= t1.[เดือน]) from table as t1 order by t1.[เดือน]
    
  select distinct t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where t2.[เดือน] >= t1.[เดือน]) from table as t1 order by t1.[เดือน]
        
    3 @R12714    
        
  
      อ.สันติสุข ครับ
1.โค๊ตที่อาจารย์ให้มา ผมต้อง ไปทำ Crosstab อีกชั้นใช่มั้ยครับ
2.เดือนที่เป็นตัวเริ่มของผมคือ เดือน 10 แต่พอ order by t1.[เดือน] มันจะเริ่มจาก เดือน 1 สามารถกำหนดใน Query เลยได้หรือไม่ครับ ให้เริ่มจาก 10
    
    
  1.โค๊ตที่อาจารย์ให้มา ผมต้อง ไปทำ Crosstab อีกชั้นใช่มั้ยครับ
2.เดือนที่เป็นตัวเริ่มของผมคือ เดือน 10 แต่พอ order by t1.[เดือน] มันจะเริ่มจาก เดือน 1 สามารถกำหนดใน Query เลยได้หรือไม่ครับ ให้เริ่มจาก 10
        
    4 @R12715    
        
  
      1. ใช่ครับ
2. เปลี่ยนเป็น
SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) >= ( (t1.[เดือน]+2) Mod 12)) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
    
  2. เปลี่ยนเป็น
SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) >= ( (t1.[เดือน]+2) Mod 12)) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
        
    5 @R12716    
        
  
      แก้ไข
เปลี่ยนจากเครื่องหมาย มากกว่า เป็น น้อยกว่า ด้วยนะครับ
    
  เปลี่ยนจากเครื่องหมาย มากกว่า เป็น น้อยกว่า ด้วยนะครับ
        
    6 @R12745    
        
  
      ขอโทษครับอาจารย์ ไปแข่งกีฬามา เพิ่งได้ลองทำวันนี้
มัน Error ตรง
select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) >= ( (t1.[เดือน]+2) Mod 12))
ก็เลยลองนับวงเล็บ เห็นว่ามันขาดไป เลยลองเติมเอง แต่ก็เหมือนเดิมครับ
    
  มัน Error ตรง
select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) >= ( (t1.[เดือน]+2) Mod 12))
ก็เลยลองนับวงเล็บ เห็นว่ามันขาดไป เลยลองเติมเอง แต่ก็เหมือนเดิมครับ
        
    7 @R12746    
        
  
      ขอโทษครับอาจารย์ ได้แล้วครับ ลืมแก้ตรง table ให้เป็น table ของผม    
    
  
        
    8 @R12747    
        
  
      อาจารย์สันติสุขครับ ถ้าใน table ของเรามีชนิดด้วย เราจะแยกให้มัน RunningSum แยกชนิดยังงัยครับ    
    
  
        
    9 @R12751    
        
  
      ในตารางของผม table มีฟิลด์ชนิด Type ด้วย ผมต้องการให้มันแยกชนิดให้ด้วย ผมเลยไปเพิ่มเงื่อนไขในตารางย่อยเป็นแบบนี้
SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) <= ( (t1.[เดือน]+2) Mod 12) And [t2].[Acc]=1) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
ผลที่ออกมามันก็ใช้ได้ครับ แต่มันมีแค่ชนิดเดียว ผมมี 3 Type ต้องทำ 3 ชุด แล้วเอามา Union กัน แล้วค่อยเอาไป CesstabQuery ทำแบบนี้มันจะประมวลผลช้ารึปล่าวครับ
    
  SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) <= ( (t1.[เดือน]+2) Mod 12) And [t2].[Acc]=1) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
ผลที่ออกมามันก็ใช้ได้ครับ แต่มันมีแค่ชนิดเดียว ผมมี 3 Type ต้องทำ 3 ชุด แล้วเอามา Union กัน แล้วค่อยเอาไป CesstabQuery ทำแบบนี้มันจะประมวลผลช้ารึปล่าวครับ
        
    10 @R12752    
        
  
      ลืมแก้ชื่อฟิลด์ครับต้องแบบนี้
SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) <= ( (t1.[เดือน]+2) Mod 12)And [t2].[Type]=1) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
    
  SELECT DISTINCT (t1.[เดือน]+2) Mod 12 AS Expr1, t1.[เดือน], (select sum(t2.[จำนวน]) from table as t2 where ((t2.[เดือน]+2) Mod 12) <= ( (t1.[เดือน]+2) Mod 12)And [t2].[Type]=1) AS Expr2
FROM table AS t1
ORDER BY (t1.[เดือน]+2) Mod 12
        
    11 @R12753    
        
  
      SELECT DISTINCT t1.[ชนิด] , ... , ... , (select sum(...) from ... where ((...) >= (...)) and (t2.[ชนิด] = t1.[ชนิด])) AS Expr2
FROM ...
ORDER BY t1.[ชนิด], (t1.[เดือน]+2) Mod 12
    
  FROM ...
ORDER BY t1.[ชนิด], (t1.[เดือน]+2) Mod 12
        
    12 @R12755    
        
  
      ทดสอบ ส่งไม่ได้
    
    
  
        
    13 @R12756    
        
  
      ผมนำโค๊ตของอาจารย์มาแก้ไขเล็กน้อยตามโครงสร้างของผม ออกมาแบบนี้
ซึ่งได้ผลลัพธ์ออกมาถูกต้อง ขั้นตอนต่อไปเอามาทำ CesstabQuery มันไม่สามารถทำได้ครับ มัน Error มันแจ้งว่าไม่พบ [t1].[เดือน]
เลยไปกำหนด เดือนใน Query มันก็ได้ผลลัพธ์ ตามที่ระบุครับ
ขอบพระคุณอาจารย์สันติสุขมากๆ ครับ ผมได้แนวคิดในการทำ RunningSum อีกแบบแล้วครับ
    
  SELECT DISTINCT ([t1].[เดือน]+2) Mod 12, t1.เดือน, t1.ชนิด, (select sum(t2.[U]) from table AS t2 where ([t2].[เดือน]+2) Mod 12 <=(([t1].[เดือน]+2) Mod 12) And (t2.[ชนิด]=t1.[ชนิด]))
FROM table AS t1
ORDER BY ([t1].[เดือน]+2) Mod 12;
ซึ่งได้ผลลัพธ์ออกมาถูกต้อง ขั้นตอนต่อไปเอามาทำ CesstabQuery มันไม่สามารถทำได้ครับ มัน Error มันแจ้งว่าไม่พบ [t1].[เดือน]
เลยไปกำหนด เดือนใน Query มันก็ได้ผลลัพธ์ ตามที่ระบุครับ
ขอบพระคุณอาจารย์สันติสุขมากๆ ครับ ผมได้แนวคิดในการทำ RunningSum อีกแบบแล้วครับ
        
    14 @R12955    
        
  
      อ.สันติสุขครับ
ผมทำ Running Sum เป็นเดือนคล้ายๆ แบบนี้ แตกต่างกันตรงที่ เดือนที่ทำ Query นี้ไม่ได้มีปีเดียว
ยกตัวอย่าง
ถ้ามีปีเดียว 11 12 1 2 3 4 5 6 7 8 9 10
ถ้ามีหลายปี 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6............
มันจะไม่ทราบว่า เดือน 11 หรือ เดือนอื่นๆ เป็นปีก่อนหลัง ทำให้ผลที่ได้ออกมาผิด
ผมลองทำดู 2-3 วันแล้วครับ ทำไม่ได้ ขอความกรุณาอาจารย์อีกครั้งครับ
    
  ผมทำ Running Sum เป็นเดือนคล้ายๆ แบบนี้ แตกต่างกันตรงที่ เดือนที่ทำ Query นี้ไม่ได้มีปีเดียว
ยกตัวอย่าง
ถ้ามีปีเดียว 11 12 1 2 3 4 5 6 7 8 9 10
ถ้ามีหลายปี 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6............
มันจะไม่ทราบว่า เดือน 11 หรือ เดือนอื่นๆ เป็นปีก่อนหลัง ทำให้ผลที่ได้ออกมาผิด
ผมลองทำดู 2-3 วันแล้วครับ ทำไม่ได้ ขอความกรุณาอาจารย์อีกครั้งครับ
        
    15 @R12958    
        
  
      สมมุติถ้าเดือน 10 นับเป็นเดือนแรกของงยประมาณ อยากทราบว่าค่าผลรวมของช่อง 12/2011 จะเท่ากับผลรวมตั้งแต่ 10/2010-12/2011 หรือว่ารวมผลรวมเฉพาะในปีงบประมาณนั้นๆ นั่นคือเป็นผลรวมของ 10/2011-12/2011 เท่านั้น    
    
  
        
    16 @R12959    
        
  
      งานนี้เป็นงานใหม่ครับอาจารย์ ไม่ได้เป็นปีงบประมาณ 
คือ ผมจะทำสต๊อกยา แล้วเวลาเลือกดูรายงาน จะต้องมีข้อมูลยอดยาเดือนเก่าอะครับ เลยคิดจะทำวิธี Running Sum เลยมาต่อกระทู้นี้ครับ
ผลรวมมันจะไม่ได้รวมเป็นปีงบ ผมจะใช่วิธีนี้ไปหักลบ เหลือยอดคงเหลือครับ
    
  คือ ผมจะทำสต๊อกยา แล้วเวลาเลือกดูรายงาน จะต้องมีข้อมูลยอดยาเดือนเก่าอะครับ เลยคิดจะทำวิธี Running Sum เลยมาต่อกระทู้นี้ครับ
ผลรวมมันจะไม่ได้รวมเป็นปีงบ ผมจะใช่วิธีนี้ไปหักลบ เหลือยอดคงเหลือครับ
        
    17 @R12960    
        
  
      ไม่เข้าใจครับ ช่วยแสดงตัวอย่างข้อมูลเหมือนในโจทย์ด้วย    
    
  
        
    18 @R12961    
        
  
      ยาแต่ละชนิด มีใช้ทุกวัน  เก็บข้อมูล ในรูป
วันที่ใช้ ชื่อยา จำนวน
แล้วยาแต่ละตัว ก็เก็บ ยอดยกมาของยา มีอีก 1 ตาราง เก็บจำนวนที่เบิกยา
วันที่เบิกยา ชื่อยา จำนวน
แต่รายงานผม ต้องการ ทราบว่า ใช้ยาไปเท่าไหร่ (วดป ที่กำหนด) เหลือเท่าไหร่ครับ
คือต้องนำ ยอดยกมา + เบิกยา - ใช้ยา = คงเหลือครับ
หน้าตารายงานเป็นแบบนี้
เดือนที่แล้ว เดือนนี้
ชื่อยา จำนวนใช้ คงเหลือ จำนวนใช้ คงเหลือ
ในรายงานผมเลือกเป็นเดือน เลยต้องทำ Running Sum แบบเป็นเดือน
ไม่แน่ใจว่า อาจารย์จะเข้าใจหรือยัง ถ้ายัง ผมจะอธิบายเพิ่มอีกครับ
ที่มาต่อกระทู้นี้เผื่อเวลาคนอื่นมาคนหา จะได้เป็นเรื่องเดียวกันเลย
    
    
  วันที่ใช้ ชื่อยา จำนวน
แล้วยาแต่ละตัว ก็เก็บ ยอดยกมาของยา มีอีก 1 ตาราง เก็บจำนวนที่เบิกยา
วันที่เบิกยา ชื่อยา จำนวน
แต่รายงานผม ต้องการ ทราบว่า ใช้ยาไปเท่าไหร่ (วดป ที่กำหนด) เหลือเท่าไหร่ครับ
คือต้องนำ ยอดยกมา + เบิกยา - ใช้ยา = คงเหลือครับ
หน้าตารายงานเป็นแบบนี้
เดือนที่แล้ว เดือนนี้
ชื่อยา จำนวนใช้ คงเหลือ จำนวนใช้ คงเหลือ
ในรายงานผมเลือกเป็นเดือน เลยต้องทำ Running Sum แบบเป็นเดือน
ไม่แน่ใจว่า อาจารย์จะเข้าใจหรือยัง ถ้ายัง ผมจะอธิบายเพิ่มอีกครับ
ที่มาต่อกระทู้นี้เผื่อเวลาคนอื่นมาคนหา จะได้เป็นเรื่องเดียวกันเลย
        
    19 @R12962    
        
  
      1) ยอดยกมา เก็บไว้ทุกเดือนหรือไม่ ถ้าใช่ก็จะมีฟิลด์ที่เก็บค่าเดือน/ปีไว้ด้วย อยากรู้ว่าฟิลด์นี้แยกออกเป็น 2 ฟิลด์คือ เดือนฟิลด์นึง และปีอีกฟิลด์นึง หรือว่าเก็บอย่างไร
2) เท่าที่อ่าน เข้าใจว่าตอนนี้มี 3 เทเบิลคือ เทเบิลการเบิก, เทเบิลการจ่าย และเทเบิลยอดยกมา ใช่หรือไม่ ถ้าไม่ใช่ ช่วยอธิบายด้วยว่ามีกี่เทเบิลกันแน่
    
  2) เท่าที่อ่าน เข้าใจว่าตอนนี้มี 3 เทเบิลคือ เทเบิลการเบิก, เทเบิลการจ่าย และเทเบิลยอดยกมา ใช่หรือไม่ ถ้าไม่ใช่ ช่วยอธิบายด้วยว่ามีกี่เทเบิลกันแน่
        
    20 @R12963    
        
      
	  
      
    
      มี 3 เทเบิลจริงครับอจารย์ 
ยอดยกมาผมเก็บไว้ที่ตาราง DRUG เป็นค่าคงที่ ฟิลด์ Startstock
ยอดเบิกเก็บไว้อีก 1 ตาราง ชื่อ drug_Receive
วันที่เบิก date_Receive (date/time)
รหัสยา drugcode (taxt)
จำนวนเบิก unit (number)
ยอดใช้ ตาราง druguse
วันที่ใช้ visitdate (date/time)
รหัสยา drugcode (taxt)
จำนวนใช้ unit (number)
ยอดเบิกจะเบิกทุกเดือนเก็บวันที่เบิกเป็นวันที่เบิกเลยครับไม่ได้แยกเดืนปี
จำนวนใช้ จะใช้ทุกวัน เก็บวันที่ใช้ เป็นวันที่เลยเหมือนกันครับ
ปัญหาของผมคือเวลา Sum เป็นเดือน การเรียงลำดับมันจะไม่เรียงตามวันจริง
เช่น วันที่1/11/2554 จะได้ค่าเดือนเป็น 11 วันที่1/11/2555 จะได้ค่าเดือนเป็น 11 เช่นกัน เมื่อทำ running sum มันจะเรียงลำดับผิด
    
    
  ยอดยกมาผมเก็บไว้ที่ตาราง DRUG เป็นค่าคงที่ ฟิลด์ Startstock
ยอดเบิกเก็บไว้อีก 1 ตาราง ชื่อ drug_Receive
วันที่เบิก date_Receive (date/time)
รหัสยา drugcode (taxt)
จำนวนเบิก unit (number)
ยอดใช้ ตาราง druguse
วันที่ใช้ visitdate (date/time)
รหัสยา drugcode (taxt)
จำนวนใช้ unit (number)
ยอดเบิกจะเบิกทุกเดือนเก็บวันที่เบิกเป็นวันที่เบิกเลยครับไม่ได้แยกเดืนปี
จำนวนใช้ จะใช้ทุกวัน เก็บวันที่ใช้ เป็นวันที่เลยเหมือนกันครับ
ปัญหาของผมคือเวลา Sum เป็นเดือน การเรียงลำดับมันจะไม่เรียงตามวันจริง
เช่น วันที่1/11/2554 จะได้ค่าเดือนเป็น 11 วันที่1/11/2555 จะได้ค่าเดือนเป็น 11 เช่นกัน เมื่อทำ running sum มันจะเรียงลำดับผิด
      Time: 0.0814s
    
      
		
ถ้าเทเบิลของคุณมีเดือนและปีด้วย และต้องการผลรวมเฉพาะจำนวนในปีนั้น เงื่อนไขต้องเปรียบเทียบปีด้วยนะครับ