MINUS clause in Access 2007 - ms-access-2007

My question is or seems to be easy.
I would like to subtract 2 queries in Access 2007.
The problem is that in query1 some records are identical (yes - I need them).
Query2 records are distinct.
Query1:
1 2 3 4
1 2 3 4
1 2 3 4
5 6 7 8
5 6 7 8
Query2:
1 2 3 4
5 6 7 8
Query1 - Query2
Expected result:
1 2 3 4
1 2 3 4
5 6 7 8
Thank you very much for your help,
Marian

You should revise those queries to bring forward:
a unique key from its table(s) for Query1
the max of the unique key for Query2
The you can write a query that retrieves those records in Query1 NOT IN Query2.

Related

SQL IFELSE Statement To create Sum Variable

TABLE 1
STUDENT TIME SCORE
1 1 4
1 2 3
1 3 4
2 1 2
2 2 2
2 3 8
3 3 10
3 4 10
4 1 1
4 2 3
4 3 2
4 4 4
4 5 4
4 6 5
I have TABLE 1. I wish to group and SUM(SCORE) for each STUDENT and TIME 1-2, 3-4, 5-6 to create this TABLE 2
STUDENT TIME TOTALSCORE
1 1-2 7
1 3-4 4
1 5-6 NA
2 1-2 4
2 3-4 8
2 5-6 NA
3 1-2 NA
3 3-4 20
3 5-6 NA
4 1-2 3
4 3-4 6
4 5-6 4
However I have BIG DATA so Wish to start by doing this
select DISTINCT(TIME) from TABLE1
1
2
3
4
5
6
and then basically take all TIME values >= 1 & < 2 as T1; >=2 & < 3 as T2; it matters because we use #.# where the first # is the year and the second # is the trimester. So there are values such as 1.1, 1.2, 1.3 but I don't wish to list that out all the time
Using integer math we can use (time-1)/2 to give us groups of all times between 1-2, 3-4, 5-6, 7-8 etc.
select student
,sum(score) as total_score
,concat((time+1)/2*2-1, '-', (time+1)/2*2) as semester
from t
group by student, (time+1)/2
order by student
student
total_score
semester
1
7
1-2
1
4
3-4
2
4
1-2
2
8
3-4
3
20
3-4
4
4
1-2
4
6
3-4
4
9
5-6
Fiddle

Can someone explain what's happening in this code? When I select two columns from different tables the output is always like this

select num1.n, 2 from num1, num2
expected output
table num1 table num2
2 2
3 3
4 4
5 5
6 6
7
8
9
10
actual output
num1, num2
2 2
3 2
4 2
5 2
6 2
7 2
8 2
9 2
10 2
3 2
4 2
5 2
6 2
7 2
8 2
9 2
10 2
3 2
4 2
5 2
6 2
7 2
8 2
9 2
10 2
Number "2" is constant in your case.
You need to understand the correct relation between two tables.
After that you can build your select with JOIN to connect data from two tables correctly.
For example:
SELECT num1.n, num2.[field_from_table_num2]
FROM num1
JOIN num2 ON num2.[relation_field_or_key]= num1.[relation_field_or_key];
you have define static column so that why you receive 2 in second column try following query
select num1.n As 'First_Table', num2.n As 'Second_Table'
from num1, num2

How to Sort records in SQL like in a parent child order

I have a table with columns "ItemId" and "ParentItemId". I want the results to be sorted in Parent-Child Order. with this, there are other columns on which the data needs to be sorted.
I want the data to be sorted based on the "itemType" First.
For Eg.
AutoId | itemId | parentItemId | itemType
1 1 0 3
2 2 null 4
3 3 0 6
4 4 null 5
5 5 1 9
6 6 2 9
7 7 3 9
8 8 4 9
9 9 0 2
10 10 0 1
Now I want the results to be drawn like in the below format
AutoId | itemId | parentItemId | itemType
10 10 0 1
9 9 0 2
1 1 0 3
5 5 1 9
2 2 null 4
6 6 2 9
4 4 null 5
8 8 4 9
3 3 0 6
7 7 3 9
Is there a way i can sort the records like this?
Any Help would be appreciated. Thank you.
You can do this:
select *
from table1
order by coalesce(parentitemid,itemid), itemid
Example: http://sqlfiddle.com/#!9/32e58e/2
For MySql use ifnull for parentItemId field
Like
select *
from table
order by IFNULL(parentItemId, itemId), itemId
for oracle
select *
from table
order by NVL(parentItemId, itemId), itemId
Taken from #hkutluay answer for SQL Server:
select * from table1 order by ISNULL(parentItemID, ItemID), ItemID

calculate the total value for each group using Calculated Column in Spotfire

I have a problem about the sum calculation for the rows using calculated column in Spotfire.
For example, the raw data is as below, the raw table is order by id, for each type, the sequence is 2,3,0.
id type value state
1 1 12 2
2 1 7 3
3 1 10 0
4 2 11 2
5 2 6 3
6 3 9 0
7 3 7 2
8 3 5 3
9 2 9 0
10 1 7 2
11 1 3 3
12 1 2 0
for type of each cycle of (2,3,0), I want to sum the value, then the result could be:
id type value state cycle time
1 1 12 2
2 1 7 3
3 1 10 0 29
4 2 11 2
5 2 6 3
6 3 7 2
7 3 5 3
8 3 9 0 21
9 2 9 0 26
10 2 7 2
11 2 3 3
12 2 2 0 12
note: only the row which its state is 0 will have the sum value , i think it will be easier to see the rules, when we order the type :
id type value state cycle time
1 1 12 2
2 1 7 3
3 1 10 0 29
4 2 11 2
5 2 6 3
9 2 9 0 26
10 2 7 2
11 2 3 3
12 2 2 0 12
6 3 7 2
7 3 5 3
8 3 9 0 21
thanks for your time and help!
Here is a solution for you.
Insert a Calculated Column RowId() and name it RowId
Insert a Calculated Column If(Mod([RowId],3)=0,[RowId] / 3,Ceiling([RowId] / 3)) and name it Groups
Insert a Calculated Column Sum([value]) OVER ([Groups]) and name it Running Sum
Insert a Calculated Column If([state] = 0,[RunningSum]) and name it OnlyState=0
The only thing to really explain here is #2. With the data sorted as you listed in your example, the last row for each group, based on the RowId, should be divisible by 3. We have to do it this way since your type field can have multiple groups for any given type. RowId 3, 6, 9, 12 etc will all have a Modulus of 0 since they are divisible by 3. This marks the last row in each set. If it is the last row, we just set it to RowId / 3. This gives us groups 1,2,3,4 etc... For the rows which aren't divisible by 3, we round them up to the nearest whole number of the divisor... which will be the last row in the set.
The last calculated column is the only way I know how to get ONLY the values you care about. If you use the If [state] = 0 logic anywhere else, you negate all other rows.

Return unique combinations from many to many join

I have a hierarchy table with the following data :
SOURCE TARGET Level ID
0 1 1 1
0 2 1 2
2 3 2 3
2 4 2 4
2 5 2 5
1 3 2 6
1 4 2 7
1 5 2 8
5 3 3 9
5 3 3 10
4 3 3 11
4 3 3 12
3 6 3 13
3 6 3 14
3 6 4 15
3 6 4 16
3 6 4 17
3 6 4 18
The SOURCE and TARGET rows are the original data and are used to connect between parents and children. for example, the third row (SOURCE 2, TARGET 3 on LEVEL 2) connects to the second row (SOURCE 0, TARGET 2 on LEVEL 1) since the Source of the first equals the target of the second.
The ID column is added at the end using a ROW_NUMBER function and is used to give each row a unique ID.
It may be easier to understand if SOURCE is replaced with PARENT and TARGET with CHILD.
I join the table to itself in order to find the "parent".
I want each "instance" of a "source" on each level to connect to one of its parents. It's not important which ones connect but all need to be connected and to different parents.
The final results should look something like this:
SOURCE TARGET Level ID P_ID
0 1 1 1 NULL
0 2 1 2 NULL
2 3 2 3 2
2 4 2 4 2
2 5 2 5 2
1 3 2 6 1
1 4 2 7 1
1 5 2 8 1
5 3 3 9 5
5 3 3 10 8
4 3 3 11 4
4 3 3 12 7
3 6 3 13 3
3 6 3 14 6
3 6 4 15 9
3 6 4 16 10
3 6 4 17 11
3 6 4 18 12
Any suggestions on how to write a good ms-sql query for this?
Link to sample data and SQL Fiddle
The query to use is below.
;with cte as (
select *,rn=row_number() over (partition by level, target
order by id),
lc=count(1) over (partition by level, target)
from tbl
)
select a.*, b.id as parent_id
from cte a
left join cte b on b.level=a.level-1
and b.target=a.source
and b.rn=(a.rn-1)%b.lc+1
order by id
Items are sequenced at each level/target combination
Children are linked to parents using by sequence, however if there are more children than parents, the MOD (%) operator takes care of going back to the first parent and continues distribution