LOC_NO W REPAIR_D EMP_CO MACHIN BAD_CO CHK_QTY
------ - -------- ------- ------ ------- -------
c301 T 20001114 12345 smd#1 ab01 120
c401 T 20001114 12345 smd#2 ab02 120
c501 B 20001114 34211 smd#3 ab03 120
c601 B 20001114 34422 pana ab04 120
위와 같은 데이터가 있습니다.
위의 내용을 아래와 같은 스트링그리드로 나타내려 합니다.
bad_co를 아래와 같이 갯수로 나타내려 합니다.
그룹 조건은 LOC_No입니다. 더 많이 내용이 있겠지만 편의상 한건씩만 올렸습니다.
loc_no가 수백개 이며 bad_co는 30여종류가 됩니다.
LOC_NO ab01 ab02 ab03 ab04
------ ---- ---- ---- ----
c301 1 0 0 0
c401 0 1 0 0
c501 0 0 1 0
c601 0 0 0 1
위와 같이 나타낼 수 있나요 ?
> LOC_NO W REPAIR_D EMP_CO MACHIN BAD_CO CHK_QTY
> ------ - -------- ------- ------ ------- -------
> c301 T 20001114 12345 smd#1 ab01 120
> c401 T 20001114 12345 smd#2 ab02 120
> c501 B 20001114 34211 smd#3 ab03 120
> c601 B 20001114 34422 pana ab04 120
>
> 위와 같은 데이터가 있습니다.
> 위의 내용을 아래와 같은 스트링그리드로 나타내려 합니다.
> bad_co를 아래와 같이 갯수로 나타내려 합니다.
> 그룹 조건은 LOC_No입니다. 더 많이 내용이 있겠지만 편의상 한건씩만 올렸습니다.
> loc_no가 수백개 이며 bad_co는 30여종류가 됩니다.
>
> LOC_NO ab01 ab02 ab03 ab04
> ------ ---- ---- ---- ----
> c301 1 0 0 0
> c401 0 1 0 0
> c501 0 0 1 0
> c601 0 0 0 1
>
> 위와 같이 나타낼 수 있나요 ?
데이터 베이스 관련 질문은 데이터베이스 종류와 버젼 개발툴을 명시하시면
좋겠군요...
SELECT SUM(DECODE(BAD_CO,'ab01', 1, 0)) AB01,
SUM(DECODE(BAD_CO,'ab02', 1, 0)) AB02,
:
:
:
GROUP BY LOC_NO
오라클의 경위 위처럼하면...
MS_SQL은 DECODE대신 CASE WHEN THEN ELSE문으로 수정하시면 될거 같은데..
그럼. 좋은결과...
microsoft jet database engine을 사용하시면 크로스탭 질의를 이용하면 되구요..
아래처럼...
TRANSFORM COUNT(*)
SELECT OrderID
FROM Orders
GROUP BY OrderID
PIVOT CustomerID;
---------------------
다음은 MDB의 예제샘플...
--------------------
다음 예제는 SQL TRANSFORM 절을 사용하여 1994년 분기별로 직원별 주문량을 보여주는 크로스탭 질의를 작성합니다. 다음 프로시저를 실행하려면 SQLTRANSFORMOutput 함수가 필요합니다.
Sub TransformX1()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; TRANSFORM " _
& "Count(OrderID) " _
& "SELECT FirstName & "" "" & LastName AS " _
& "FullName FROM Employees INNER JOIN Orders " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart " _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & " _
& """ "" & LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"", OrderDate)"
' 사용자 컴퓨터의 Northwind경로를 나타내도록 다음 행을 수정하십시오.
Set dbs = OpenDatabase("Northwind.mdb")
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
다음 예제는 SQL TRANSFORM 절을 사용하여 1994년 분기별로 각 직원이 수주한 총 액수를 보여주는 약간 복잡한 크로스탭을 작성합니다. 다음 프로시저를 실행하려면 SQLTRANSFORMOutput 함수가 필요합니다.
Sub TransformX2()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; TRANSFORM " _
& "Sum(Subtotal) SELECT FirstName & "" """ _
& "& LastName AS FullName " _
& "FROM Employees INNER JOIN " _
& "(Orders INNER JOIN [Order Subtotals] " _
& "ON Orders.OrderID = " _
& "[Order Subtotals].OrderID) " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart" _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & "" """ _
& "& LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"",OrderDate)"
' 사용자 컴퓨터의 Northwind경로를 나타내도록 다음 행을 수정하십시오.
Set dbs = OpenDatabase("Northwind.mdb")
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
Function SQLTRANSFORMOutput(qdfTemp As QueryDef, _
intYear As Integer)
Dim rstTRANSFORM As Recordset
Dim fldLoop As Field
Dim booFirst As Boolean
qdfTemp.PARAMETERS!prmYear = intYear
Set rstTRANSFORM = qdfTemp.OpenRecordset()
Debug.Print qdfTemp.SQL
Debug.Print
Debug.Print , , "Quarter"
With rstTRANSFORM
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop.Name
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop.Name;
End If
Next fldLoop
Debug.Print
Do While Not .EOF
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop;
End If
Next fldLoop
Debug.Print
.MoveNext
Loop
End With
End Function
제가 찾아본 바로는 다른 엔진에서는 크로스탭질의 비슷한 기능은 못찾겠더군요...
스크립트 상에서 해결을 해야 하지 않을까요?