Определите, есть ли в записи много продуктов - PullRequest
0 голосов
/ 30 апреля 2019

Я использую Access и Power BI для решения этой проблемы, но безрезультатно.В принципе, это на самом деле довольно просто, но мне нужно сделать это особым образом для последующих расчетов цен.

По сути, у меня есть таблица с транзакциями с идентификатором услуги.Этот идентификатор сервиса появится несколько раз с одним или несколькими продуктами.Если это всего лишь один продукт, тогда мне нужно заполнить столбец «Один продукт», в противном случае «Несколько продуктов».См. Ниже для иллюстрации:

Serviceid  Product  Type
1          A        Multiple Products
1          B        Multiple Products
2          A        Single Product
3          A        Single Product
3          A        Single Product
3          A        Single Product

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

В Power BI вы можете сделать это в Power Query:

let
    Source = SourceTable,
    fnDistinct = (MyTable, MyServiceid) =>
        let
            #"Filtered Rows" = Table.SelectRows(MyTable, each ([Serviceid] = MyServiceid)),
            #"Distinct Products" = List.Count(List.Distinct(#"Filtered Rows"[Product]))
        in
            #"Distinct Products",
    #"Added M Type" = Table.AddColumn(Source, "M Type", each if fnDistinct(Source, [Serviceid]) > 1 then "Multiple Products" else "Single Product", type text)
in
    #"Added M Type"

Или используя DAX:

DAX Type = 
VAR CountProducts = 
    CALCULATE(
        DISTINCTCOUNT ( Table1[Product] ),
        ALLEXCEPT ( Table1, Table1[Serviceid] )
    )
RETURN
    SWITCH ( 
        CountProducts,
        1, "Single Product",
        "Multiple Products"
    )

Рабочий пример файла PBIX: https://pwrbi.com/so_55918190/

Решение DAX для тестирования производительности, на 250 000 строк:

enter image description here

0 голосов
/ 30 апреля 2019

Используйте простой подзапрос:

Select 
    Serviceid,
    Product,
        IIf((Select Count(*) 
        From  YourTable As T
        Group By Serviceid, Product
        Having T.Serviceid = YourTable.Serviceid And T.Product = YourTable.Product) = 1, "Single Product", "Multiple Products") As [Type]
From
    YourTable
Group By
    Serviceid,
    Product
0 голосов
/ 30 апреля 2019

Вы можете использовать IIF() с EXISTS для заполнения нового столбца

select
  t.serviceid,
  t.product,
  iif(
    exists (
      select 1 from tablename where serviceid = t.serviceid and product <> t.product
    ),
    'Multiple Products',
    'Single Product'
  ) as type
from tablename as t
...