DAX/powerpivot equivalent to T-SQL where in - tsql

I am unable to construct the query equivalent to the T-SQL below.
I am working on our new analytics dashboard and I have solved almost everything what I wanted, but I have stuck on the one problem.
Image with table and T-SQL query
http://server.esterminal.cz/dax/all.PNG
Table
ID ProductID TimeID StoreID Price
797190 7946 267 73 100
797191 7946 269 73 101
797192 7946 270 73 102
797193 7946 271 73 104
797194 7946 271 74 105
797195 7947 271 74 200
797196 7947 271 73 202
797197 7947 271 75 203
Query
SELECT *
FROM ProductFact
WHERE ProductID IN (SELECT ProductID
FROM ProductFact
WHERE StoreID = 75)
Result
ID ProductID TimeID StoreID Price
797195 7947 271 74 200
797196 7947 271 73 202
797197 7947 271 75 203
I want to show all the products that are on offer in one store and show the details of any other stores that stock the product.
I know that I have overlooked something "big", but after 6 hours of attempting to find a way, I decided to ask to someone who has more experience than me.
Thank you for help.
Michal

I found solution which work for me.
EVALUATE FILTER( ProductFact, CONTAINS(FILTER(ProductFact, ProductFact[StoreID]=75),
ProductFact[ProductID], ProductFact[ProductID]) )

Related

Trying to partition to remove rows where two columns don't match sql

How can I filter out rows within a group that do not have matching values in two columns?
I have a table A like:
CODE
US_ID
US_PRICE
NON_US_ID
NON_US_PRICE
5109
57
10
75
10
0206
85
11
58
11
0206
85
15
33
14
0206
85
41
22
70
T100
20
10
49
NULL
T100
20
38
64
38
Within each CODE group, I want to check whether US_PRICE = NON_US_PRICE and remove that row from the resulting table.
I tried:
SELECT *,
CASE WHEN US_PRICE != NON_US_PRICE OVER (PARTITION BY CODE) END
FROM A;
but I think I am missing something when I try to partition by CODE.
I want the resulting table to look like
CODE
US_ID
US_PRICE
NON_US_ID
NON_US_PRICE
0206
85
15
33
14
0206
85
41
22
70
T100
20
10
49
NULL
For provided sample, simple WHERE clause could produce such result:
SELECT *
FROM A
WHERE US_PRICE IS DISTINCT FROM NON_US_PRICE;
IS DISTINCT FROM handles NULLs comparing to != operator.

PostgreSQL Lag Function between of Two Tables

I am new to Postgresql/Python, so please bear with me!
Assuming we have two tables:
item table having a itemid, price, time.
user table having colums userid, itemid, timecreated, quantity, firstprice, lastprice, difference.
Table examples like :
item table:
itemid price time
RBK 92 1546408800
LBV 51 1546408800
ZBT 49 1546408800
GLS 22 1546408800
DBC 17 1546408800
RBK 91 1546495200
LBV 55 1546495200
ZBT 51 1546495200
GLS 24 1546495200
DBC 28 1546581600
RBK 108 1546581600
LBV 46 1546581600
ZBT 49 1546581600
GLS 21 1546581600
DBC 107 1546581600
In item table all those values comes up with api.
and user table:
userid itemid timecreated quantitty firstprice currentprice difference
1 RBK 1546408800 20
2 RBK 1546408800 15
3 RBK 1546408800 35
3 GLS 1546408800 101
3 DBC 1546495200 140
1 RBV 1546495200 141
2 RBK 1546495200 25
2 RBV 1546581600 31
User table is djangobased table which is user can register\add new items to follow prices.
My struggle access the item table to fetch first price which is having a same timestamp. In that example userid 1 RBK First price (1546408800) must be filling with 92
I did some trick with postgresql with (lag) But this does not seems to be working:
update user
set firstprice = tt.prev_price
from (select item.*,
lag(price) over (partition by itemid order by time) as prev_price
from item
) tt
where tt.id = item.id and
tt.prev_close is distinct from item.price;
I can call current price from the api but didnt find out the way to filling firstprice from the item table. I will be making for a trigger for this query. I searched on google and on stackoverflow but I couldn't find anything that could help me. Thanks in advance.
I can advice next approach (may be not fastest):
update "user" set firstprice = (
select price from "item" i
where i.itemid = "user".itemid and i.time >= "user".timecreated order by i.time limit 1
);
It calculate firstprice using sub-query. Test this SQL here

TSQL Select TOP and Distinct from one table into a TEMP table

I have the following table:
Data nr1 nr2 nr3 nr4 nr5 nr6
2020-09-12 6 15 36 42 67 78
2020-09-10 46 48 67 78 80 87
2020-09-08 23 27 28 31 69 89
2020-09-05 7 14 27 56 72 83
2020-09-03 16 17 38 39 68 84
2020-09-01 10 22 28 45 48 71
2020-08-29 1 3 35 42 55 61
2020-08-27 37 49 52 53 75 87
2020-08-25 15 24 31 70 83 84
2020-08-22 7 12 45 47 73 87
2020-08-20 7 17 30 39 41 67
2020-08-18 13 22 28 58 65 77
2020-08-17 5 9 26 62 77 79
2020-08-13 4 5 49 57 66 75
2020-08-11 7 9 38 68 78 80
2020-08-08 6 16 22 55 58 83
2020-08-06 21 37 40 46 69 80
2020-08-04 5 19 21 25 45 82
2020-08-01 4 14 17 18 26 45
2020-07-30 4 15 19 26 28 55
2020-07-28 23 45 49 71 80 82
2020-07-25 18 30 42 70 78 80
2020-07-23 10 29 37 49 56 57
2020-07-21 4 34 46 54 55 62
2020-07-18 18 33 49 76 80 84
I have to do the following task:
Select into a #TEMP table with only one column DistinctNumbers all distinct numbers of the above table because some numbers in the above table might be repeated across rows and columns.
Select into another #TEMP table all numbers in the range from 1 to 99 which are not in the original table.
What is the best way of accomplishing these two tasks?
You should unpivot original table first
1.Unpivot original table into #temp table
2.Now you have all numbers in one column
3.Use while between 1 and 99 and insert counter into #RESULT table where not in #temp(unpivoted table)
SELECT DISTINCT(num) num INTO #TEMP_DISTINCT_NUMBERS FROM ORIGINAL_TABLE UNPIVOT (
num
FOR PivotColumn IN (nr1,nr2,nr3,nr4,nr5,nr6)
) AS UNPIVOTE_TABLE
CREATE TABLE #RESULT(NUM INT)
DECLARE #COUNTER INT =1;
WHILE(#COUNTER<=99)
BEGIN
INSERT INTO #RESULT SELECT #COUNTER WHERE #COUNTER NOT IN (SELECT num FROM
#TEMP_DISTINCT_NUMBERS)
SET #COUNTER=#COUNTER+1
END
SELECT * FROM #RESULT
you can try this:
;WITH tally
AS (SELECT 1 AS num
UNION ALL
SELECT num + 1
FROM tally
WHERE num < 99)
SELECT DISTINCT tally.num
FROM tally
LEFT JOIN
( SELECT num FROM #dataset --your dataset
CROSS APPLY (VALUES (nr1),(nr2),(nr3),(nr4),(nr5),(nr6)) AS B (num)
) AS dataset
ON tally.num = dataset.num
WHERE dataset.num IS NULL
Code above:
Create [tally] recursive common table expression with sequence from 1 to 99
Left join tally with your unpivoted dataset ...
test here: https://rextester.com/YEB57637

Recursive CTE with multiple valid same parent child relationships

I have an equipment inventory application I am working on. The piece of equipment is my top level and it contains assemblies, sub-assemblies and parts. I am trying to use recursive CTE to display the parent/child relationships. The issue I am having is that some assemblies can have multiple sub-assemblies that are the same, meaning there is not difference in the part numbers. This is causing my query to not show the correct relationship based on my order by statement. This is the first time I have used CTE so I have be using a lot learned on the web.
PartNumberID 174 is used twice in this assembly.
Sample Table
equipmentID parentPartNumberID partNumberID
17 1 281
17 281 156
17 156 161
17 161 224
17 281 174
17 174 192
17 192 56
17 174 193
17 281 174
17 174 192
17 192 56
17 174 193
17 281 283
17 ` 283 183
17 283 277
17 283 173
Results of Query
PARENT CHILD PARTLEVEL HIERARCHY
1 281 0 281
281 156 1 281.156
156 161 2 281.156.161
161 224 3 281.156.161.224
281 174 1 281.174
281 174 1 281.174
174 192 2 281.174.192
174 192 2 281.174.192
192 56 3 281.174.192.56
192 56 3 281.174.192.56
174 193 2 281.174.193
174 193 2 281.174.193
281 283 1 281.283
283 173 2 281.283.173
283 183 2 281.283.183
283 277 2 281.283.277
As you can see the hierarchy is created correctly but I it is not being returned correctly because there is nothing unique for these 2 assemblies for the order by statement.
The Code:
with parts(PARENT,CHILD,PARTLEVEL,HIERARCHY) as (select parentPartNumberID,
--- Used to get rid of duplicates
CASE WHEN ROW_NUMBER() OVER (PARTITION BY partNumberID ORDER BY partNumberID) > 1
THEN NULL
ELSE partNumberID END AS partNumberID,
0,
CAST( partNumberID as nvarchar) as PARTLEVEL
FROM db.tbl_ELEMENTS
WHERE parentPartNumberID=1 and equiptmentID=17
UNION ALL
SELECT part1.parentPartNumberId,
--- Used to get rid of duplicates
CASE WHEN ROW_NUMBER() OVER (PARTITION BY parts1.partNumberID ORDER BY parts1.partNumberID) > 1
THEN 10000 + parts1.partNumberID
ELSE parts1.partNumberID END,
PARTLEVEL+1,
cast(parts.hierarchy + '.' + CAST(parts1.partNumberID as nvarchar) as nvarchar)
from dbo.tbl_BOM_Elements as parts1 inner
join parts onparts1.parentPartNumberID=parts.CHILD
where id =17)
select CASE WHEN PARENT > 10000
THEN PARENT - 10000
ELSE PARENT END AS PARENT,
CASE WHEN CHILD > 10000
THEN CHILD - 10000
ELSE CHILD END AS CHILD,
PARTLEVEL,HIERARCHY
from parts
order by hierarchy
I tried to create a unique ID to order but was not successful. Any suggestions would be greatly appreciated.
I'll start by just answering the part about getting a sequential id.
If you have control you could just a unique Id to your source table. Having a surrogate primary key would be pretty typical here.
You could instead use a second CTE before the recursive one and add the row numbers there using ROW_NUMBER() OVER BY (ORDER BY equipmentID, parentPartNumberID, partNumberID). Then build your recursive CTE off of that rather than the source table directly.
Better might be to use the first CTE to instead GROUP BY equipmentID, parentPartNumberID, partNumberID and add a COUNT(1) field. This would let you instead use the count in you hierarchy rather than getting the duplicates. Something like 281.283.277x2 or whatever.

T-SQL Merge records based on criteria

In SQL server 2008, I have below table Score. I want to show Score1 and Score2 together for same student. Name and Email combined uniquely identifies a student (Name or Email may be missing too, like Jack and Maya#moon.com). The expected output shown as T_Combined.
Score
Name Email Score1 Score2
John 'John#pluto.com' 75
Peter 'Peter#pluto.com' 34
Nina 'Nina#pluto.com' 45
Joseph 'Joseph#pluto.com' 76
Tom 'Tom#pluto.com' 43
Sam 'Sam#pluto.com' 76
Nancy 'Nancy#pluto.com' 12
Tina 'Tina#pluto.com' 56
John 'John#mars.com' 98
Peter 'Peter#mars.com' 12
Nina 'Nina#mars.com' 45
Joseph 'Joseph#mars.com' 87
Tom 'Tom#mars.com' 67
Sam 'Sam#mars.com' 99
Nancy 'Nancy#mars.com' 33
Tina 'Tina#mars.com' 23
John 'John#pluto.com' 86
Peter 'Peter#pluto.com' 56
Nina 'Nina#pluto.com' 98
Joseph 'Joseph#pluto.com' 78
Tom 'Tom#pluto.com' 12
Sam 'Sam#pluto.com' 45
Nancy 'Nancy#pluto.com' 76
Tina 'Tina#pluto.com' 78
John 'John#mars.com' 98
Peter 'Peter#mars.com' 45
Nina 'Nina#mars.com' 76
Joseph 'Joseph#mars.com' 12
Tom 'Tom#mars.com' 84
Sam 'Sam#mars.com' 27
Nancy 'Nancy#mars.com' 54
Tina 'Tina#mars.com' 50
Jack 10
'Maya#moon.com' 20
T_Combined
Name Email Score1 Score2
John 'John#pluto.com' 86
Peter 'Peter#pluto.com' 56
Nina 'Nina#pluto.com' 98
Joseph 'Joseph#pluto.com' 78
Tom 'Tom#pluto.com' 43 12
Sam 'Sam#pluto.com' 76 45
Nancy 'Nancy#pluto.com' 12
Tina 'Tina#pluto.com' 56
John 'John#mars.com' 98
Peter 'Peter#mars.com' 12
Nina 'Nina#mars.com' 45 76
Joseph 'Joseph#mars.com' 87 12
Tom 'Tom#mars.com' 67 84
Sam 'Sam#mars.com' 99 27
Nancy 'Nancy#mars.com' 33 54
Tina 'Tina#mars.com' 23 50
Jack 10
'Maya#moon.com' 20
Many thanks
Create table Score (Name varchar(20),Email varchar(20),Score1 int,Score2 int)
insert into Score (Name,Email,Score1)values('John','John#pluto.com',75)
insert into Score (Name,Email,Score1)values('Peter','Peter#pluto.com',34)
insert into Score (Name,Email,Score1)values('Nina','Nina#pluto.com',45)
insert into Score (Name,Email,Score1)values('Joseph','Joseph#pluto.com',76)
insert into Score (Name,Email,Score1)values('Tom','Tom#pluto.com',43)
insert into Score (Name,Email,Score1)values('Sam','Sam#pluto.com',76)
insert into Score (Name,Email,Score1)values('Nancy','Nancy#pluto.com',12)
insert into Score (Name,Email,Score1)values('Tina','Tina#pluto.com',56)
insert into Score (Name,Email,Score1)values('John','John#mars.com',98)
insert into Score (Name,Email,Score1)values('Peter','Peter#mars.com',12)
insert into Score (Name,Email,Score1)values('Nina','Nina#mars.com',45)
insert into Score (Name,Email,Score1)values('Joseph','Joseph#mars.com',87)
insert into Score (Name,Email,Score1)values('Tom','Tom#mars.com',67)
insert into Score (Name,Email,Score1)values('Sam','Sam#mars.com',99)
insert into Score (Name,Email,Score1)values('Nancy','Nancy#mars.com',33)
insert into Score (Name,Email,Score1)values('Tina','Tina#mars.com',23)
insert into Score (Name,Email,Score2)values('John','John#pluto.com',86)
insert into Score (Name,Email,Score2)values('Peter','Peter#pluto.com',56)
insert into Score (Name,Email,Score2)values('Nina','Nina#pluto.com',98)
insert into Score (Name,Email,Score2)values('Joseph','Joseph#pluto.com',78)
insert into Score (Name,Email,Score2)values('Tom','Tom#pluto.com',12)
insert into Score (Name,Email,Score2)values('Sam','Sam#pluto.com',45)
insert into Score (Name,Email,Score2)values('Nancy','Nancy#pluto.com',76)
insert into Score (Name,Email,Score2)values('Tina','Tina#pluto.com',78)
insert into Score (Name,Email,Score2)values('John','John#mars.com',98)
insert into Score (Name,Email,Score2)values('Peter','Peter#mars.com',45)
insert into Score (Name,Email,Score2)values('Nina','Nina#mars.com',76)
insert into Score (Name,Email,Score2)values('Joseph','Joseph#mars.com',12)
insert into Score (Name,Email,Score2)values('Tom','Tom#mars.com',84)
insert into Score (Name,Email,Score2)values('Sam','Sam#mars.com',27)
insert into Score (Name,Email,Score2)values('Nancy','Nancy#mars.com',54)
insert into Score (Name,Email,Score2)values('Tina','Tina#mars.com',50)
insert into Score (Name,Score1)values('Jack',10)
insert into Score (Email,Score2)values('Maya#moon.com',20)
select Name, Email, isnull(SUM(Score1),'') as Score1, isnull(SUM(Score2),'') as Score2
from Score
group by Name, Email