Counting consecutive numbers into one row
Hello everyone,
I have recently discovered that we can use Max ( Decode ()) function of Oracle to pivot the results of a table. I have executed this just fine. However, pivoting a table is just one part of the solution that I need. The pivoting function results to something like this:
01,02,03,05,06,07,08,09,10,11,12,13,14,16,17,20,21,23,25What I actually need is something like this:
1-17, 20-21,23,25I really don't know how to start solving this but so far I have the below query:
SELECT DISTINCT
MAX(DECODE(wldw.wafernumber,'01', '01'))
|| MAX(DECODE(wldw.wafernumber,'02', ',02'))
|| MAX(DECODE(wldw.wafernumber,'03', ',03'))
|| MAX(DECODE(wldw.wafernumber,'04', ',04'))
|| MAX(DECODE(wldw.wafernumber,'05', ',05'))
|| MAX(DECODE(wldw.wafernumber,'06', ',06'))
|| MAX(DECODE(wldw.wafernumber,'07', ',07'))
|| MAX(DECODE(wldw.wafernumber,'08', ',08'))
|| MAX(DECODE(wldw.wafernumber,'09', ',09'))
|| MAX(DECODE(wldw.wafernumber,'10', ',10'))
|| MAX(DECODE(wldw.wafernumber,'11', ',11'))
|| MAX(DECODE(wldw.wafernumber,'12', ',12'))
|| MAX(DECODE(wldw.wafernumber,'13', ',13'))
|| MAX(DECODE(wldw.wafernumber,'14', ',14'))
|| MAX(DECODE(wldw.wafernumber,'15', ',15'))
|| MAX(DECODE(wldw.wafernumber,'16', ',16'))
|| MAX(DECODE(wldw.wafernumber,'17', ',17'))
|| MAX(DECODE(wldw.wafernumber,'18', ',18'))
|| MAX(DECODE(wldw.wafernumber,'19', ',19'))
|| MAX(DECODE(wldw.wafernumber,'20', ',20'))
|| MAX(DECODE(wldw.wafernumber,'21', ',21'))
|| MAX(DECODE(wldw.wafernumber,'22', ',22'))
|| MAX(DECODE(wldw.wafernumber,'23', ',23'))
|| MAX(DECODE(wldw.wafernumber,'24', ',24'))
|| MAX(DECODE(wldw.wafernumber,'25', ',25')) AS WAFERS
FROM a_wiplothistory wl
JOIN Container C ON (wl.containerid = c.containerid OR wl.containerid= c.splitfromid )
JOIN a_wiplotdetailshistory wld ON wl.wiplothistoryid = wld.wiplothistoryid
JOIN a_wiplotdetailswafershistory wldw ON wld.wiplotdetailshistoryid = wldw.wiplotdetailshistoryid
WHERE c.containername = :lotThanks for helping guys.
Edited by: 1001275 on May 15, 2013 6:28 PM
Hi,
1001275 wrote:
Hello everyone,
I have recently discovered that we can use Max ( Decode ()) function of Oracle to pivot the results of a table. I have executed this just fine. However, pivoting a table is just one part of the solution that I need...You said it!
First, you need some way of grouping consecutive rows together (1-17 in one group, 20-21 in anoter, 23 as a group all by itself, and so on).
Then you need GROUP BY to get infmation about each goup, such as the smallest and largest number in the group.
Finally, you need to combine all that information into one big string. This is actually an example of String Aggregation , rather than pivoting. The two are closely related. Pivot means you're taking 1 column on multiple rows, and putting them into multiple columns on one row. String Aggregation is taking 1 column on multple row, and concatenating all their contents into one big string column.
Here's one way to do it:
WITH got_group_id AS
SELECT wafernumber
, ROW_NUMBER () OVER (ORDER BY wafernumber)
- wafernumber AS group_id
FROM wldw
, got_group_info AS
SELECT TO_CHAR (MIN (wafernumber))
|| CASE
WHEN COUNT (*) > 1
THEN '-' || TO_CHAR (MAX (wafernumber))
END AS group_label
, ROW_NUMBER () OVER (ORDER BY MIN (wafernumber))
AS group_num
FROM got_group_id
GROUP BY group_id
SELECT SUBSTR ( SYS_CONNECT_BY_PATH (group_label, ',')
, 2
) AS txt
FROM got_group_info
WHERE CONNECT_BY_ISLEAF = 1
START WITH group_num = 1
CONNECT BY group_num = PRIOR group_num + 1
AND prior sys_guid () is not null
;I find the first part of this query to be the trickiest. I used the Fixd Difference technique to assign a common group_id to consecutive rows. See {message:id=9953384} and/or {message:id=9957164} foran explantaion of the Fixed Difference technique.
Next, in sub-query got_group_info, I used aggregate functions to produce a group_label, such as '1-17', and to assign consecutive numbers to each group. This is also a little tricy, because it involves nesting an aggregate function (MIN in this case) inside an analytc function (ROW_NUMBER).
Finally, I used SYS_CONNECT_BY_PATH to do the string aggregation.
Output:
TXT
1-17,20-21,23,25Whenever you have a question, please post CREATE TABLE and INSERT statements for some sample data. For example:
CREATE TABLE wldw
( wafernumber NUMBER (3) PRIMARY KEY
INSERT INTO wldw (wafernumber) VALUES ( 1);
INSERT INTO wldw (wafernumber) VALUES ( 2);
INSERT INTO wldw (wafernumber) VALUES ( 3);
INSERT INTO wldw (wafernumber) VALUES ( 4);
INSERT INTO wldw (wafernumber) VALUES ( 5);
INSERT INTO wldw (wafernumber) VALUES ( 6);
INSERT INTO wldw (wafernumber) VALUES ( 7);
INSERT INTO wldw (wafernumber) VALUES ( 8);
INSERT INTO wldw (wafernumber) VALUES ( 9);
INSERT INTO wldw (wafernumber) VALUES (10);
INSERT INTO wldw (wafernumber) VALUES (11);
INSERT INTO wldw (wafernumber) VALUES (12);
INSERT INTO wldw (wafernumber) VALUES (13);
INSERT INTO wldw (wafernumber) VALUES (14);
INSERT INTO wldw (wafernumber) VALUES (15);
INSERT INTO wldw (wafernumber) VALUES (16);
INSERT INTO wldw (wafernumber) VALUES (17);
INSERT INTO wldw (wafernumber) VALUES (20);
INSERT INTO wldw (wafernumber) VALUES (21);
INSERT INTO wldw (wafernumber) VALUES (23);
INSERT INTO wldw (wafernumber) VALUES (25);I realize that your table (and your query) are a lot more complicated, but it looks like you can show the part you don't already understand using just this one table with this one column.
Also, whenever you have a question, say which version oif Oracle you'e using (e.g., 11.2.0.2.0).
The query above should work in Oracle 10.1 and up. I got the wong results in the main query in Oracle 10.2, however. (Oracle 10.2 has a lot of bugs related to CONNECT BY.) It worked fine in version 11.1.
If you're using Oracle 11.2, you'll want to use LISTAGG, not SYS_CONNECT_BY_PATH, to do the string aggregation.
For more about string aggregation in various versions of Oracle, see this Oracle Base page.
Similar Messages
-
Merging rows into one row but into SEPARATE Columns
Hello Gurus,
I have searched alot on OTN and many other places, but no where I could get the solution of how can we merge rows into one row but separate column. For example
Consider the below scenario
"DEPARTMENT", "EMP","NAME","SUBJECT"
"Electronics","1","Sam","LIC"
"Electronics","2","Pam","VLSI"
"Electronics","3","Tom","C"
"Mech","1","Abu","Thermo"
"Mech","4","Lina","Machines"Now, I need the output like
Based on Department as Group By Clause
"DEPARTMENT", "EMP1","NAME1","SUBJECT1","EMP2","NAME2","SUBJECT2","EMP3","NAME3","SUBJECT3"
"Electronics","1","Sam","LIC","2","Pam","VLSI","3","Tom","C"
"Mech","1","Abu","Thermo","4","Lina","Machines"
The row data to be loaded into separate columns. Name of the column is not an issue... can be anythingIn all the forums which I went through I could find them loading into a single column, but not into respective separate columns.
Any help would be much appreciated.
Thanks848265 wrote:
Frank,
I saw your name nearly n number of times, as I went through many forums today... And the link which you have just posted, I went through it today afternoon.
Could you please explain this bit taken from your dynamic pivot post.
SELECT DISTINCT
', COUNT (CASE WHEN job = '''
|| job
|| ''' ' AS txt1
, 'THEN 1 END) AS '
|| job
|| '_CNT' AS txt2
FROM scott.emp
ORDER BY txt1;Many Thanks.You only need that when you need column aliases based on the actual data (and you explicitly said you don't need that) or when can't put an upper bound on the number of columns to be displayed. If that doesn't apply to this problem, then don't use any kind of dynamic SQL (like the code above); it makes the job much more difficult, less efficient and less robust.
Here's what the code above is doing.
If you were hard-coding a query that showed the number of people in each job, and you knew that the possible jobs were 'ANALYST', 'CLERK' and 'MANAGER', then you might hard-code a query like this:
SELECT deptno
, COUNT (CASE WHEN job = 'ANALYST' THEN 1 END) AS analyst
, COUNT (CASE WHEN job = 'CLERK' THEN 1 END) AS clerk
, COUNT (CASE WHEN job = 'MANAGER' THEN 1 END) AS manager
FROM scott.emp
GROUP BY deptno
;If the jobs had different names, or if there were not 3 different jobs, then you would have to change the lines in the SELECT clause that start with ", COUNT ( CASE ...".
The code you posted is from an example of dynamic SQL, where you first run a Preliminary Query . (What you posted above is, in fact, the complete preliminary query.) The output of that preliminary query is exactly the variable part of the real query, such as:
, COUNT (CASE WHEN job = 'ANALYST' THEN 1 END) AS analyst
, COUNT (CASE WHEN job = 'CLERK' THEN 1 END) AS clerk
, COUNT (CASE WHEN job = 'MANAGER' THEN 1 END) AS managerYou then use this output as part of your main query. In other words, you can write something today that will generate exacrly as many columns as you need next year, with names from the data as it is next year. How? because you're not writing the full query today. The variable part will be written by the preliminary query when it runs next year. -
A way to roll up rows into one row
Is there a way to "roll up" a set number of rows into one row? I would like to have a row that can be expanded into several rows by clicking a plus sign or something similar. Anyway to do this?
Regards,
MarkMark,
Sorry, it didn't occur to me that you meant "hiding". It sounds like you already know how to hide and unhide but unfortunately there are no shortcuts. I agree that it would be nice to have a way to unhide a selected row or column and if my memory serves me I submitted a request for this feature some months ago. May I suggest that you also go to Main Menu > Numbers > Provide Numbers Feedback.
The more requests for features they receive the better the chance for getting them in future updates. Best wishes,
pw -
How to combine many rows into one row
Hi all,
I have a question regarding to how to combine many rows into one row?
My result set is like that:
ITEM_NO NAME1
11 abc
11 cde
11 fg
Want to combine them into
ITEM_NO NAME1
11 abc;cde;fg
would anybody can tell me how to do that? Thanks
RayYou can check this --
satyaki>
satyaki>
satyaki>create table t
2 as
3 select 11 ITEM_NO, 'abc' NAME1 from dual
4 union all
5 select 11 ITEM_NO, 'cde' NAME1 from dual
6 union all
7 select 11 ITEM_NO, 'fg' NAME1 from dual;
Table created.
satyaki>
satyaki>
satyaki>
satyaki>set lin 10
satyaki>
satyaki>desc t;
Name Null? Type
ITEM_NO NUMBER
NAME1 VARCHAR2(3)
satyaki>
satyaki>
satyaki>set lin 1000
satyaki>
satyaki>
satyaki>
satyaki>SELECT ITEM_NO,
2 LTRIM(MAX(SYS_CONNECT_BY_PATH(NAME1,';'))
3 KEEP (DENSE_RANK LAST ORDER BY curr),';') AS NAME1_DET
4 FROM (SELECT ITEM_NO,
5 NAME1,
6 ROW_NUMBER() OVER (PARTITION BY ITEM_NO ORDER BY NAME1) AS curr,
7 ROW_NUMBER() OVER (PARTITION BY ITEM_NO ORDER BY NAME1) -1 AS prev
8 FROM t)
9 GROUP BY ITEM_NO
10 CONNECT BY prev = PRIOR curr AND ITEM_NO = PRIOR ITEM_NO
11 START WITH curr = 1;
ITEM_NO NAME1_DET
11 abc;cde;fgRegards.
Satyaki De. -
Combining like results into one row
The statement below works. However when the results are returned there are multiple values returned for the same "Period" that I would like to see returned into one row.
SELECT "Request ID", "External Customer", "Staff Prof Id", "Period", "Planned External", "Actual External", "Planned Internal", "Actual Internal", "Total Planned", "Actual Total"
FROM (
SELECT ppl.request_id "Request ID", ppl.mdpr_bds_ext_customer "External Customer", cells.staff_prof_id "Staff Prof Id", period.period_short_name "Period", CELLS.PLANNED_FTE/100 "Planned External", CELLS.actual_fte/100 "Actual External", 0 "Planned Internal", 0 "Actual Internal", /*skills.skill_name,*/ total.plan_total_fte/100 "Total Planned", total.actual_total_fte/100 "Actual Total"
FROM RML.MREQ_MDPR_PROJ PPL, knta.krsc_staff_prof_line_cells_v CELLS, knta.krsc_staff_prof_lines_v LINES, knta.knta_periods PERIOD, knta.krsc_skills_v SKILLS, knta.krsc_staff_prof_period_sum TOTAL
where PPL.MDPR_BDS_SUB_PROJ IS NOT NULL AND PPL.KNTA_STAFFING_PROFILE = CELLS.STAFF_PROF_ID(+) AND cells.staff_prof_line_id = lines.staff_prof_line_id AND ppl.knta_staffing_profile = total.staff_prof_id
AND cells.period_id = period.period_id AND lines.skill_id = skills.skill_id AND skills.skill_name like '%External%' AND total.period_id = period.period_id
UNION
SELECT ppl.request_id "Request ID", ppl.mdpr_bds_ext_customer "External Customer", cells2.staff_prof_id "Staff Prof Id", period.period_short_name "Period", 0 "Planned External", 0 "Actual External", CELLS2.planned_fte/100 "Planned Internal", CELLS2.actual_fte/100 "Actual Internal", /*skills.skill_name,*/ total.plan_total_fte/100 "Total Planned", total.actual_total_fte/100 "Actual Total"
FROM RML.MREQ_MDPR_PROJ PPL, knta.krsc_staff_prof_line_cells_v CELLS2, knta.krsc_staff_prof_lines_v LINES, knta.knta_periods PERIOD, knta.krsc_skills_v SKILLS, knta.krsc_staff_prof_period_sum TOTAL
where PPL.MDPR_BDS_SUB_PROJ IS NOT NULL AND PPL.KNTA_STAFFING_PROFILE = CELLS2.STAFF_PROF_ID(+) AND cells2.staff_prof_line_id = lines.staff_prof_line_id AND ppl.knta_staffing_profile = total.staff_prof_id
AND cells2.period_id = period.period_id AND lines.skill_id = skills.skill_id AND skills.skill_name not like '%External%' AND total.period_id = period.period_id)
ORDER BY "Request ID"Probably you are looking at something like GROUP BY "Request ID", "External Customer", "Staff Prof Id", "Period" and SUM () the other columns. As Enrico says, examples of actual and desired output would be helpful.
At a glance a UNION of...
AND skills.skill_name LIKE '%External%'...and...
AND skills.skill_name NOT LIKE '%External%'...seems a slightly strange approach. -
Combining multiple rows into one row
Hi all.
My most humble apology for this question but solutions in previous threads did not seem to help much.
Apparently, my account has not been verified and I am currently at home with no access to the SQL code so i can't post the actual code.
We have this (mockup) of code
Select S.C1, AViewSS.Study, AViewSS.SlotName, IST.TakenByDate, IST.ScannedByTime, SE.TimepointCalculation
From IST
INNER JOIN
AViewSS ON IST.GroupID = AViewSS.GroupID and
IST.SlotID = AViewSS.SlotID
INNER JOIN
S ON AViewSS.StudyID = S.StudyID
INNER JOIN
SE ON IST.Line = SE.Line and IST.SubLine = SE.SubLine and
AViewSS.ScheduleID = SE.ScheduleID
WHERE
(IST.GroupID = 92) and (IST.SlotID between 1791 and 1795)
and (AViewSS.VisitID = 137)
The query currently returns this result set
Col 1 Col 2 Taken Date Date 1 Date 2 Date 3
Scanned DateTime
Data Data 3/12/2015 3/12/2015 7:22
3/12/2015 7:22
Data Data 3/12/2015 3/12/2015 8:47
3/12/2015 8:47
Data Data 3/12/2015
3/12/2015 9:27 3/12/2015 9:27
Data Data 3/22/2015 3/22/2015 7:27
3/22/2015 7:27
Data Data 3/22/2015
Data Data 4/12/2015
Data Data 4/12/2015
Data Data 4/12/2015
You’ll notice that rows 1, 2, 3 are related as are rows 4, 5 and rows 6, 7, 8.
This is what we ultimately want to see given the results above.
In the report, rows 1, 2, 3 from the results should roll into one row with the ScannedByTimeStamp from each row returned by the query populating the appropriate report time column based on the value of a column in the row.
Col 1 Col 2 Taken Date Date 1 Date 2
Date 3
Data Data 3/12/2015 3/12/2015 7:22 3/12/2015 8:47 3/12/2015 9:27
Data Data 3/22/2015 3/22/2015 7:27
Data Data 4/12/2015
We would appreciate any guidance.Hi Duane,
The table and matrix data regions can display complex data relationships by including nested tables,matrices, lists, charts and gauges. Tables and matrices have a tabular layout and their data comes from a single dataset, built on a single data source. The
key diference between tables and matrices is that tables can include only row groups, where as matrices have row groups and columns groups.
All Code in this sample are downloadable from
this URL
create procedure spMultiple
as
begin
declare @Mytable table ([Col 1] varchar(20),[Col 2] varchar(20),[Taken Date] varchar(20),[Date 1] varchar(20),[Date 2] varchar(20),[Date 3] varchar(20))
Insert into @Mytable ([Col 1],[Col 2],[Taken Date],[Date 1],[Date 2],[Date 3])
select * from
Select 'Data' as [Col 1],'Data' as [Col 2],'3/12/2015' as [Taken Date],'3/12/2015 7:22' as [Date 1],'' as [Date 2],'' as [Date 3]
union all
Select 'Data' as [Col 1],'Data' as [Col 2],'3/12/2015' as [Taken Date],'' as [Date 1],'3/12/2015 8:47' as [Date 2],'' as [Date 3]
union all
Select 'Data' as [Col 1],'Data' as [Col 2],'3/12/2015' as [Taken Date],'' as [Date 1],'' as [Date 2],'3/12/2015 9:27' as [Date 3]
union all
select 'Data' as [Col 1],'Data' as [Col 2],'3/22/2015' as [Taken Date],'' as [Date 1],'3/22/2015 7:27' as [Date 2],'' as [Date 3]
union all
select 'Data' as [Col 1],'Data' as [Col 2],'3/22/2015' as [Taken Date],'' as [Date 1],'' as [Date 2],'' as [Date 3]
union all
select 'Data' as [Col 1],'Data' as [Col 2],'4/12/2015' as [Taken Date],'' as [Date 1],'' as [Date 2],'' as [Date 3]
union all
select 'Data' as [Col 1],'Data' as [Col 2],'4/12/2015' as [Taken Date],'' as [Date 1],'' as [Date 2],'' as [Date 3]
union all
select 'Data' as [Col 1],'Data' as [Col 2],'4/12/2015' as [Taken Date],'' as [Date 1],'' as [Date 2],'' as [Date 3]
) as temp;
with Mytable2(
[Col 1],
[Col 2],
[Taken Date],
[Date],
[NameDate]
as
SELECT
[Col 1],
[Col 2],
[Taken Date],
[Date],
[NameDate]
FROM
(SELECT
[Col 1],
[Col 2],
[Taken Date],
[Date 1],
[Date 2],
[Date 3]
FROM
@MyTable) as p
UNPIVOT
[Date] FOR [NameDate] IN ([Date 1],[Date 2],[Date 3])
)AS unpvt
group by
[Col 1],
[Col 2],
[Taken Date],
[Date],
[NameDate]
Select * from Mytable2 t1 where [date]<>''
end
Please Mark This As Answer if it solved your issue
Please Vote This As Helpful if it helps to solve your issue
Ricardo Lacerda -
Combining Rowsets into one row
Hi All,
Can we combine Rowset 1 and Rowset2 into one row
As there are two rowsets and nothing is common between the two rowsets so i cant do normalization.The problem due to rowset is if one rowset returns only one row and other rowset returns two rows then in Grid it shows only one Row
Any method to eliminate this problem
Best Regards
NamitaHi Namita,
It sounds like you need nested repeaters and an output document with columns for each field in the two rowsets. If I understand you correctly, something like this would work:
1. Create xMII XML Output Document with a column for each field of interest from Rowset 1 & 2.
2. Repeat on Rowset 1
3. Repeat on subset of Rowset 2 related to Rowset 1
4. Add Row to Document with data from each repeater.
5. Once you complete building your document, you can use it with an BLS (Xacute) query for the grid.
The difficulty for me is how you would determine the subset of Rowset 2 which is related to Rowset 1. Can you even do that? It may require some dynamic linking (xPath) to filter Rowset 2.
Hope this helps,
Mike -
Help needed to set consecutive numbering in table rows
I need to set up a table so that the first column is a column of consecutive numbers (much like the record count).
The table will be followed with a text frame, and then a new table will start.
HOWEVER. I wanted to numbers in the first column to continue consecutively.
I am using this for a lengthy explanation of technical instructions: one instruction/ per line.
There will be about 1000+ instructions over the course of this 200-page book. The second column contains a checkbox, which is why I am having problems setting this up in an ordinary word-processing program, because of export issues (Dont ask). The third column contains the instruction.
I am hoping that Numbers will solve my formatting problems.
*Is there a simple way to set up the first table column in a sheet to number the rows consecutively, and continue the numbering each time a new table is inserted?*
I hope I have explained this well enough.Fred, is it possible for this to work with other number related items. I'm talking specifically about sequential inventory numbers. At work I used excel, but now that computer is dead, and I'm working from home. I've refused to install microsoft products on my home machine for quite a while. I love numbers, and am glad it's out, so I am never even tempted by the "devil". Sorry got off topic.
Essentially I used to write BLX-001 in cell one, BLX-002 in cell two, then do the drag method. When I have text in the Numbers cell though it won't give consecutive numbers, just continually repeat the numbers in the first two cells. Any helps -
How to Group Few Rows into One Rows In Query
Dear All,
I've use the "Group By" syntax in my query, but when the result display, it still show few rows instead of one row.
Current Results
item Jan Feb Mar
A 10 0 20
A 10 0 0
A 0 5 0
B 0 0 10
Desire Result
item Jan Feb Mar
A 20 5 20
B 0 0 10
My query is:
/*select from [dbo].[oinv] T0 */
declare @customer varchar (200)
/* where */
set @customer = /* T0.Cardname */ '[%A]'
/*select from [dbo].[inv1] T1 */
declare @fromdate as datetime
/* where */
set @fromdate = /* T1.DOCDATE */ '[%1]'
/*select from [dbo].[inv1] T2 */
declare @tilldate as datetime
/* where */
set @tilldate = /* T1.DOCDATE */ '[%2]'
SELECT inv1.ITEMCODE, oitm.itemname,
CASE WHEN MONTH(INV1.DOCDATE) = 1 THEN SUM(QUANTITY) ELSE NULL END AS 'JAN',
CASE WHEN MONTH(INV1.DOCDATE) = 2 THEN SUM(QUANTITY) ELSE NULL END AS 'FEB',
CASE WHEN MONTH(INV1.DOCDATE) = 3 THEN SUM(QUANTITY) ELSE NULL END AS 'MAR',
CASE WHEN MONTH(INV1.DOCDATE) = 4 THEN SUM(QUANTITY) ELSE NULL END AS 'APR',
CASE WHEN MONTH(INV1.DOCDATE) = 5 THEN SUM(QUANTITY) ELSE NULL END AS 'MAY',
CASE WHEN MONTH(INV1.DOCDATE) = 6 THEN SUM(QUANTITY) ELSE NULL END AS 'JUN',
CASE WHEN MONTH(INV1.DOCDATE) = 7 THEN SUM(QUANTITY) ELSE NULL END AS 'JUL',
CASE WHEN MONTH(INV1.DOCDATE) = 8 THEN SUM(QUANTITY) ELSE NULL END AS 'AUG',
CASE WHEN MONTH(INV1.DOCDATE) = 9 THEN SUM(QUANTITY) ELSE NULL END AS 'SEPT',
CASE WHEN MONTH(INV1.DOCDATE) = 10 THEN SUM(QUANTITY) ELSE NULL END AS 'OCT',
CASE WHEN MONTH(INV1.DOCDATE) = 11 THEN SUM(QUANTITY) ELSE NULL END AS 'NOV',
CASE WHEN MONTH(INV1.DOCDATE) = 12 THEN SUM(QUANTITY) ELSE NULL END AS 'DEC'
FROM OINV inner join inv1 on oinv.DocEntry = inv1.DocEntry INNER JOIN OITM on inv1.itemcode = oitm.itemcode
WHERE oinv.cardname =@customer AND inv1.DOCDATE >=@fromdate AND inv1.DOCDATE <=@tilldate
GROUP BY inv1.ITEMCODE, oitm.itemname, inv1.docdate
I've tried to write in "Select Syntax" too, but still get the same result. I'm really have no idea what's wrong with my query. Thanks for all your help!
Cheers,
SereneHi Serene,
in last query I forgot in subquery condition for customer (the sum was for all customers).
Try this:
SELECT distinct inv1.ITEMCODE, oitm.itemname,
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 1 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'JAN',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 2 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'FEB',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 3 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'MAR',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 4 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'APR',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 5 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'MAY',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 6 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'JUN',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 7 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'JUL',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 8 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'AUG',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 9 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'SEP',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 10 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'OCT',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 11 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'NOV',
(select coalesce(sum(x.quantity),0) from inv1 x with(nolock), oinv xx with(nolock) where xx.docentry = x.docentry and xx.cardname = @customer and inv1.itemcode = x.itemcode and month(x.docdate ) = 12 and x.DOCDATE >=@fromdate AND x.DOCDATE <=@tilldate) as 'DEC'
FROM OINV
inner join inv1 on oinv.DocEntry = inv1.DocEntry
INNER JOIN OITM on inv1.itemcode = oitm.itemcode
WHERE oinv.cardname =@customer and quantity > 0
AND inv1.DOCDATE >=@fromdate AND inv1.DOCDATE <=@tilldate -
Concatenate strings from more rows into one row.
Hi,
what's the name of that analytical function (or connect by) that
would return strings from more rows as one row concatenated. i.e.:
(I know this is possible using regular pipelined functions.)
ROW1: STR1
ROW2: STR2
ROW3: STR3
select tadah().... from ...
result:
ROW1: STR1 STR2 STR3Thanks.Hi,
Here's a basic example of SYS_CONNECT_BY_PATH.
The query below produces one row of output per department, containing a list of the employees in that department, in alphabetioc order.
WITH got_rnum AS
SELECT ename
, deptno
, ROW_NUMBER () OVER ( PARTITION BY deptno
ORDER BY ename
) AS rnum
FROM scott.emp
-- WHERE ... -- Any filtering goes here
SELECT deptno
, LTRIM ( SYS_CONNECT_BY_PATH ( ename
, ',' -- Delimiter, must never occur in ename
) AS ename_list
FROM got_rnum
WHERE CONNECT_BY_ISLEAF = 1
START WITH rnum = 1
CONNECT BY rnum = PRIOR rnum + 1
AND deptno = PRIOR deptno
;Output:
. DEPTNO ENAME_LIST
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARDThe basic CONNECT BY query would produce one row per employee, for example:
. DEPTNO ENAME_LIST
10 ,CLARK
10 ,CLARK,KING
10 ,CLARK,KING,MILLER
20 ,ADAMS
20 ,ADAMS,FORD
...The WHERE clause: <tt>WHERE CONNECT_BY_ISLEAF = 1</tt> means that we'll only see the last row for every department.
SYS_CONNECT_BY_PATH (which is a row function, by the way, not an analytic fucntion) puts a delimiter (',' in the example above) before every item on the list, including the first one.
The query above uses LTRIM to remove the delimiter at the very beginning.
WM_COMCAT (or the equivalent user-defined STRAGG, which you can copy from AskTom) is much more convenient if order is not important. -
How to combine data from two rows into one row
I have the following sets of data. I want to find all the duplicate sets of field values. in the data below there is only one duplicate set: brenda, analyst, green.
DocID and Doc Seq combine to form the set key. FieldID I believe are consistent in that 1 is always name, 2 is job, 3 is favorite color etc. but there are up to 20 field IDs.
To tell you the truth, my client is a bit sketchy about the data and the values. I would like collapse the sets by getting all the field values into a single row. They could be in the same column, or in their own columns. This way I can then look for whatever
dups my customer seems to think that he has.
the first image is what i want (either in same column or in different columns. but they have to be in the order of the FieldID), the second is what i have. THANKSCREATE TABLE #t (
c1 INT NOT NULL PRIMARY KEY,
c2 VARCHAR(50) NOT NULL
GO
INSERT INTO #t(c1, c2) VALUES(1, 'P1,P2,P3')
INSERT INTO #t(c1, c2) VALUES(2, 'P2,P3')
GO
-- Generate set of numbers
-- Idea from Itzik Ben-Gan
;WITH
L0 AS (SELECT 1 AS n UNION ALL SELECT 1),
L1 AS (SELECT 1 AS n FROM L0 AS a, L0 AS b),
L2 AS (SELECT 1 AS n FROM L1 AS a, L1 AS b),
L3 AS (SELECT 1 AS n FROM L2 AS a, L2 AS b),
L4 AS (SELECT 1 AS n FROM L3 AS a, L3 AS b),
Numbers AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS Number FROM L4)
SELECT
t.c1,
t.c2,
SUBSTRING(',' + t.c2 + ',', Number + 1, CHARINDEX(',', ',' + t.c2 + ',',
Number + 1) - Number - 1) AS Item,
ROW_NUMBER() OVER(PARTITION BY t.c1 ORDER BY n.Number) AS rn
FROM
#t AS t, Numbers AS n
WHERE
n.Number <= LEN(t.c2)
AND SUBSTRING(',' + t.c2 + ',', n.Number, 1) = ','
ORDER BY
t.c1, rn
GO
DROP TABLE #t
GO
Best Regards,Uri Dimant SQL Server MVP,
http://sqlblog.com/blogs/uri_dimant/
MS SQL optimization: MS SQL Development and Optimization
MS SQL Consulting:
Large scale of database and data cleansing
Remote DBA Services:
Improves MS SQL Database Performance
SQL Server Integration Services:
Business Intelligence -
Convert multiple rows in a table into one row based on the primary key
I have 2 tables
CREATE TABLE Files (FileID int, fileName varchar(20))
insert into Files values (1,'F1')
insert into Files values (2,'F2')
insert into Files values (3,'F3')
CREATE TABLE Versions (FileID int, VersionNum varchar(10))
insert into Versions values (1, 'V1')
insert into Versions values (1, 'V2')
insert into Versions values (1, 'V3')
insert into Versions values (2, 'V1')
The two tables join using FileID. I want a listing of the fileName and the all corresponding versions on one line. There may not be a version for a file or there may be multiple versions for the file. The output I want is
F1, V1, v2, v3
F2, V1
F3
Any help would be appreciated.
lggardner,
If you want them as different columns, you can PIVOT. However, this requires to know the max numebr of versions that may be there (here I have done with 3). If you dont have that info, then you might have to resort to dynamic SQL..
;with cte
as
select f.fileid,f.fileName,ISNULL(v.VersionNum,'') as VersionNum,row_number() over(partition by f.fileid order by f.filename,v.versionnum) rownum from #files f
left join #versions v
on f.fileid=v.fileid
select fileid,fileName,ISNULL([1],'') as [1],ISNULL([2],'') as [2],ISNULL([3],'') as [3]
from
select * from cte
) tab
PIVOT
Max(VersionNum) for rownum in ([1],[2],[3])
) pvt
Thanks,
Jay
<If the post was helpful mark as 'Helpful' and if the post answered your query, mark as 'Answered'> -
How to merge many rows into one row
hello,
I have two tables T1, T2.
T1 (ID NUMBER, TEXT VARCHAR2(1000))
T2 (POS NUMBER, LINE VARCHAR(100))
Is it posible to get all rows of T2.LINE concated and insert them into T1.TEXT?
Thank you for any help.SELECT ID, text, NULL pos, NULL line
FROM t1
UNION ALL
SELECT NULL ID, NULL text, pos, line
FROM t2regards,
friend -
How to turn many rows into one row with many coloums
When I have a table for example
NR DATA
1 abc
2 dfg
3 hijI must convert this into a view that would look like:
1 2 3
abc dfg hijThe number of rows is dynamic. So I cannot make a static view.
I cannot use pivot because I use Oracle 10g.
Can anyoune help me?
Edited by: WoMo on 25.04.2013 07:23Hi,
WoMo wrote:
My NR values and DATA values are not known!You can use String Aggregation for that. See {message:id=10963258}
For more options, see {message:id=3527823}
I hope this answers your question.
If not, post your best attempt, along with a little sample data (CREATE TABLE and INSERT statements), and also post the results you want from that data.
See the forum FAQ {message:id=9360002} -
Counting consecutive numbers in a view
Say I have the following data in a table:
ID YEAR
1 2004
1 2005
1 2006
1 2008
1 2009
2 1998
2 1999
2 2000
Is there anyway to return a 3rd row in a query which would return a 1 if the previous rows YEAR was 1 different, but a 0 if otherwise. So the data would look like this:
ID YEAR COUNT
1 2004 0
1 2005 1
1 2006 1
1 2008 0
1 2009 1
2 1998 0
2 1999 1
2 2000 1
2 2001 1
2 2002 1
2 2006 0
I am basically trying to find out if someones yearly membership was a renewal. Here's the data:
with t1 as (select 1 as ID,2004 as YEAR from dual union
select 1,2005 from dual union
select 1,2006 from dual union
select 1,2008 from dual union
select 1,2009 from dual union
select 2,1998 from dual union
select 2,1999 from dual union
select 2,2000 from dual union
select 2,2001 from dual union
select 2,2002 from dual union
select 2,2006 from dual)
select ID,
YEAR
from t1
order by id, year;
Thanks,
AndrewThanks for providing sample data and expected results!
I think this is what you want.
SQL> with t1 as (select 1 as ID,2004 as YEAR from dual un
2 select 1,2005 from dual union
3 select 1,2006 from dual union
4 select 1,2008 from dual union
5 select 1,2009 from dual union
6 select 2,1998 from dual union
7 select 2,1999 from dual union
8 select 2,2000 from dual union
9 select 2,2001 from dual union
10 select 2,2002 from dual union
11 select 2,2006 from dual)
12 SELECT ID
13 , YEAR
14 , (CASE
15 WHEN YEAR - LAG(YEAR) OVER (PARTITION BY ID ORDER BY YEAR) = 1
16 THEN 1
17 ELSE 0
18 END) AS RENEWAL
19 FROM t1
20 ORDER BY ID
21 , YEAR
22 /
ID YEAR RENEWAL
1 2004 0
1 2005 1
1 2006 1
1 2008 0
1 2009 1
2 1998 0
2 1999 1
2 2000 1
2 2001 1
2 2002 1
2 2006 0
11 rows selected.
Maybe you are looking for
-
Mac mini mid 2011 video blinking out too
As the 2012 mac mini, my mac mini mid 2011 with the 3000 graphics chipset, has video blinking out every hour for about a second, since I upgraded from an ancient cinema display (1600x1040) to a DELL U2713HM 2560x1440 pixels. The old display blinked v
-
I want to see how much hard drive space I have remaining on my MacBook Pro, so I open Finder and press 'show status bar' and the finder window gets bigger, but the bottom, where the status bar should be, is blank. Is there something I'm missing?
-
Physical Schema and logical schema
Hi, When creating the data server in the topology corresponding to the appropriate technology we are creating a physical schema. But then why do we need to create logical schema. Is it created for execution of the interface? And can multiple physical
-
hi sappians, when i maintain the source list ( assign with scheduling agreement for MRP, even i maintained 2 for MRP), i am facing the following error " Please enter the document number and item togethere" . pls help me....it is urgent..... Thanks to
-
Leopard on my MacBook Pro but need Tiger for certain apps...
I want to load Leopard onto my MacBook Pro but I need Tiger in order to run Pro Tools. I'd like to install Tiger on a 400FW external drive. Not sure how to do this and don't know if the 400 is fast enough to run the operating system. Any ideas on how