Subject | RE: [firebird-support] Re: Grouping without sorting alphabetically |
---|---|
Author | Svein Erling Tysvær |
Post date | 2015-02-13T09:49:23Z |
Dataset:
1 Haemogram Report 1 Routine Haemogram
1 Haemogram Report 5 Diff. Count (Mature Cells)
1 Haemogram Report 10 Special Investigations
2 Haemogram Report 1 Diff. Count (Mature Cells)
3 C-Reactive Protine 1
4 Urine Analysis 1 Physical Examination
4 Urine Analysis 8 Chemical Examination
4 Urine Analysis 10 Microscopic Examination of Centrifugalised Deposit
5 Haemogram Report 1 E.S.R.
Bhavbhutis attempt:
WITH cteTestGroups AS (SELECT MIN(A.iSrNo) AS iGroupSrNo
, B.cTitle
, MIN(C.iSrNo) AS iSubGroupSrNo
, C.cSubGroup
FROM sReqSlipTestGroup A
JOIN mTestGroups B
ON B.iID = A.iTestGroupID
JOIN lTestGroupsTest C
ON C.iPID = B.iID
JOIN mTests D
ON D.iID = C.iTestID
WHERE A.iPID = 1
GROUP BY B.lNewPage
, A.iSrNo
, B.cTitle
, C.cSubGroup
ORDER BY 1, 2, 3, 4)
SELECT cteTG.*
FROM cteTestGroups cteTG
WITH cteTestGroups (iGroupSrNo, cTitle, iSubGroupSrNo, cSubGroup AS
(SELECT MIN(A.iSrNo), B.cTitle, MIN(C.iSrNo), C.cSubGroup
FROM sReqSlipTestGroup A
JOIN mTestGroups B ON B.iID = A.iTestGroupID
JOIN lTestGroupsTest C ON C.iPID = B.iID
JOIN mTests D ON D.iID = C.iTestID
WHERE A.iPID = 1
GROUP BY B.lNewPage, A.iSrNo, B.cTitle, C.cSubGroup),
cteOrderGroups(cTitle, cOrder) AS
(select cTitle, min(iGroupSrNo)
from cteTestGroups
group by 1)
SELECT cteTG.*
FROM cteTestGroups cteTG
JOIN cteOrderGroups cteOG on cteTG.cTitle = cteOG.cTitle
ORDER BY cteOG.cOrder, cteTG.iSubGroupSrNo
Maybe things could be simplified further, but this at least ought to work.
Set
1 Haemogram Report 1 Routine Haemogram
1 Haemogram Report 5 Diff. Count (Mature Cells)
1 Haemogram Report 10 Special Investigations
2 Haemogram Report 1 Diff. Count (Mature Cells)
3 C-Reactive Protine 1
4 Urine Analysis 1 Physical Examination
4 Urine Analysis 8 Chemical Examination
4 Urine Analysis 10 Microscopic Examination of Centrifugalised Deposit
5 Haemogram Report 1 E.S.R.
Bhavbhutis attempt:
WITH cteTestGroups AS (SELECT MIN(A.iSrNo) AS iGroupSrNo
, B.cTitle
, MIN(C.iSrNo) AS iSubGroupSrNo
, C.cSubGroup
FROM sReqSlipTestGroup A
JOIN mTestGroups B
ON B.iID = A.iTestGroupID
JOIN lTestGroupsTest C
ON C.iPID = B.iID
JOIN mTests D
ON D.iID = C.iTestID
WHERE A.iPID = 1
GROUP BY B.lNewPage
, A.iSrNo
, B.cTitle
, C.cSubGroup
ORDER BY 1, 2, 3, 4)
SELECT cteTG.*
FROM cteTestGroups cteTG
>My final output I want something like this:I think an additional CTE may be what you want:
>1 Haemogram Report 1 Routine Haemogram
>1 Haemogram Report 5 Diff. Count (Mature Cells)
>1 Haemogram Report 10 Special Investigations
>5 Haemogram Report 1 E.S.R.
>3 C-Reactive Protine 1
>4 Urine Analysis 1 Physical Examination
>4 Urine Analysis 8 Chemical Examination
>4 Urine Analysis 10 Microscopic Examination of Centrifugalised Deposit
>
>ie. The Row 4 is merged with row 2 and row 9 becomes row 4
>
>The idea is that all the cTitle are clubbed together but in the order they were originally selected, thus MIN(A.iSrNo).
>The second grouping is cSubGroup, together but in the order they were defined, thus MIN(C.iSrNo)
WITH cteTestGroups (iGroupSrNo, cTitle, iSubGroupSrNo, cSubGroup AS
(SELECT MIN(A.iSrNo), B.cTitle, MIN(C.iSrNo), C.cSubGroup
FROM sReqSlipTestGroup A
JOIN mTestGroups B ON B.iID = A.iTestGroupID
JOIN lTestGroupsTest C ON C.iPID = B.iID
JOIN mTests D ON D.iID = C.iTestID
WHERE A.iPID = 1
GROUP BY B.lNewPage, A.iSrNo, B.cTitle, C.cSubGroup),
cteOrderGroups(cTitle, cOrder) AS
(select cTitle, min(iGroupSrNo)
from cteTestGroups
group by 1)
SELECT cteTG.*
FROM cteTestGroups cteTG
JOIN cteOrderGroups cteOG on cteTG.cTitle = cteOG.cTitle
ORDER BY cteOG.cOrder, cteTG.iSubGroupSrNo
Maybe things could be simplified further, but this at least ought to work.
Set