Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
PorscheHans
Contributor
Contributor

Zählenwenn

Hallo zusammen, 

ich bin neu bei Qlik Sense und bräucht ein wenig Untertsützung. 

PorscheHans_0-1681385034895.png

ich bräuchte z.B. eine Formel die mir angibt wieviele "ProdNr" zugleich ein 1P7 haben als auch ein 04K. 
Das müsste doch ein Count(if offen "K8k" like ... and PDCC "1P7" like ... , ProdNr) oderso sein.. 
Ich bin nicht wirklich geübt in der Notation.. 

LG 

Labels (1)
17 Replies
klos
Contributor II
Contributor II

Hallo @marcus_sommer 

WOW  - das geht in die richtige Richtung!  Du bist echt der Hammer!
count({< Produkt = {'A'}> * < Produkt = {'B'}> } distinct Kunde)
count({< [product group (rev)] = {'Deskphone'}> * < [product group (rev)] = {'DECT-Telefone'}> } distinct ID)

Liefert ein korrektes Ergebnis, 🙂 🙂 🙂 vielen herzlichen Dank dafür.

Zu der Formel habe ich noch zwei Fragen.

Kann ich diese Formel auf Produkt =  C, D, E erweitern und wenn ja, wie?
Hab paar Varianten probiert aber ohne Erfolgt,
count({< Produkt = {'A'}> * < Produkt = {'B'}> } distinct Kunde)


Kann man die Fomel in eine Aggr einbinden, damit ich ein Auswahlfeld zum Selektieren habe.
Beispiel meiner aggr Formel für Umsatz Cluster.

if(aggr(sum ([Umsatz]) , [ID])<101 and aggr (sum ([Umsatz]) , [ID]) >=1,'Umsatz 1-100 ',

Im text wäre diese so, aber leider ohne Ergebnis.

if(aggr(count([Produkt]) , [ID])='A' and aggr (count([Produkt]) , [ID]) = 'B','kauft produkt A+B '

VG





marcus_sommer

Es sollten sich auch weitere Produkte integrieren lassen, wie hier:

count({< Produkt = {'A'}> * < Produkt = {'B'}> * < Produkt = {'C'}> * < Produkt = {'D'}> } distinct Kunde)

Für eine selektierbares Cluster benötigt man nur eine aggr() und bevor man etliche If-Abfragen verschachtelt, könnte man auch class nehmen, vielleicht so:

class(aggr(sum(< Produkt = {'A'}> *  < Produkt = {'B'}> } Umsatz), ID), $(vClusterGröße))

und steuert dann das Cluster flexibel über eine Variable.

klos
Contributor II
Contributor II

Super

count({< Produkt = {'A'}> * < Produkt = {'B'}> * < Produkt = {'C'}> * < Produkt = {'D'}> } distinct Kunde)

Bitte Schritt für Schritt 🙂  klappt bei mir nicht ganz.

Ich versuche erst mal, nur zu aggr
count({< Produkt = {'A'}> * < Produkt = {'B'}> * < Produkt = {'C'}> * < Produkt = {'D'}> } distinct Kunde)

aggr()

=aggr (count({< [product group (rev)] = {'Deskphone'}> * < [product group (rev)] = {'DECT-Telefone'}> } distinct ID), 'kaufen produkt A+B')

it if hab ich es auch nicht geklappt

klos_0-1702296645143.png

 

 

 





marcus_sommer

Es ist nicht ganz klar, was hier erreicht werden soll und warum?

klos
Contributor II
Contributor II

Hallo @marcus_sommer ,

erst mal herzlichen Dank für deinen Support und deine Geduld.


Erreicht werden soll:
Dass ich die bestimmten Käufer in gewissen Gruppen einteilen kann.

Das Ermitteln der Kennzahlen klappt, denke ich.  In deiner Formel kann ich sowohl einschließen und aufschließen ->.

Jetzt würde ich gern, angelehnt an den Ergebnis, ein Selektionfeld generien. In dem ich dann zur Auswahl die Ergebnisse habe.
Beispiel: buy Deskphone + Dect-Telefon. Beim Selektieren, werden nun alle 1.087 Kunden selektiert, somit kann ich a pürfen, ob das Eregbnis Valide ist und B alles andere sehen, was mit diesem Ergebnis zusammen hängt.

Nur die Anzahl, ist zu wenig um mit dem Ergebnis weiter arbeiten zu können.

klos_0-1702388848044.png

Beim Umsatz Cluster, habe ich das hinbekommen.
Deine Formel bekomme ich aber leider nicht darauf angepasst. 😞
Beispiel1.
count({< [product group (rev)] = {'Deskphone'}> * < [product group (rev)] = {'DECT-Telefone'}> } distinct ID)
Beispiel2:
count({< [year (rev)] = {'2021'}> *  -< [year (rev)] = {'2022'}> *  -< [year (rev)] = {'2023'}>*  -< [year (rev)] = {'2020'}> } distinct ID)

Was mache ich falsch hier, um einen Auswahlwert zu erhalten?
=
if(aggr(count({< [product group (rev)] = {'Deskphone'}> * < [product group (rev)] = {'DECT-Telefone'}> } distinct [ID]) ,'buy Deskphone + DECT-Telefone',
if(aggr(count({< [product group (rev)] = {'Deskphone'}> * -< [product group (rev)] = {'DECT-Telefone'}> } distinct ID) ,'buy only Deskphone ',
))))

Liefern ein Ergebnis, siehe oben Bild.
buy Deskphone + DECT-Telefone (1.087)
count({< [product group (rev)] = {'Deskphone'}> * < [product group (rev)] = {'DECT-Telefone'}> } distinct ID)
buy only Deskphone  (1.740)
count({< [product group (rev)] = {'Deskphone'}> * -< [product group (rev)] = {'DECT-Telefone'}> } distinct ID)


VG MIch

marcus_sommer

UND-Verknüpfungen sind teilweise sehr tricky - insbesondere wenn nicht nur Felder, sondern auch Feld-Werte, zueinander in einer UND-Beziehung stehen sollen. Die Komplexität wird schnell unterschätzt und mit den ODER-Verknüpfungen gleichgesetzt, wobei die wesentlichen Zusammenhänge zwischen den Daten leicht übersehen werden  können.

Normale BI Datenmodelle (nicht nur in Qlik) sind hierfür nicht ausgelegt und es hängt durchaus von den Datenstrukturen im Datenmodell ab (Fakten oder Dimensionen sowie Einzel-Werte pro relevante ID oder Multiple-Werte) sowie dann auch von den Objekt-Dimensionen und Auswahlen, ob und wie UND-Verknüpfungen darstellbar sind oder eben auch nicht. Falls man hier wirklich gesteigerte Anforderungen hat, kommt man meist nicht um entsprechend aufbereitete bzw. spezialisierte Datenmodelle nicht herum.

Früher in QlikView gab es hierfür auch ein spezielles Features, den AND-Mode, den es in Sense nicht mehr gibt - sondern workarounds, die in die oben erwähnte Richtung von:

count({< Produkt = {'A', 'B'}>} distinct Kunde) * -(count({< Produkt = {'A', 'B'}>} distinkt Produkt)=2)

gehen. Das bedeutet verkürzt gesagt, nehme die Ausgangs-Formel mit ODER-Bedingungen und setze die UND-Bedingung als ein boolesches WAHR/FALSCH Ergebnis dagegen. In Deinem Fall könnte das dann vielleicht so aussehen:

=class(aggr(
   sum({< [KPI] = p([KPI AND]) >} [Value]) *
   rangemax(1, -(count({< [KPI] = p([KPI AND]) >} distinct [KPI])=getselectedcount([KPI AND]))),
[Kategorie]), $(var))

wobei [KPI] deinem Prüf-Feld entspricht und [KPI AND] aus einer Island-Table stammt (also nicht verbunden mit dem Datenmodell) und die distinkten Werte des Prüf-Feldes enthalten. Bedeutet, über eine extra List-Box lässt sich steuern, welche Feld-Werte in einer ODER-Beziehung in der sum() und count() berücksichtigt werden und die count() wird dann mit der Anzahl der möglichen Feld-Werte abgeglichen. Die rangemax() fängt den Fall ab, dass  keine UND-Verknüpfungen gesetzt sind.

Das Ganze ist dann in eine aggr() eingebettet, die dann noch die erforderlichen Dimensionalitäten benötigt - hier einfach mit Kategorie angegeben - sowie dann in eine Clusterung per class(), deren Größe über eine Variable gesteuert werden könnte. Somit sind auch sehr dynamische Sichten grundsätzlich implementierbar.

Hier mal noch ein paar Links mit Hintergrund-Infos:

AND-Mode - Qlik Community - 1471352

Generating AND, OR , NOT selection logic in Qlik S... - Qlik Community - 1479510

 

klos
Contributor II
Contributor II

@marcus_sommer Puuh, ich komme etwas an meine Grenzen.
Ich versuche mein Bestes, die Informationen richtig zu verarbeiten.
Beispiel aus - Generating AND, OR , NOT selection logic in Qlik S... - Qlik Community - 1479510
Konnte ich nachstellen. 🙂
Mit deiner Formel bin ich aber ehrlich gesagt, überfordert.
Du hast es sicherlich verständlich erklärt, nur bekomme ich die Bezüge nicht ganz auf meine Daten abgeleitet.

http://qlik.binom.net/training/qlik-cookbook/design/set-analysis/p-und-e/
Das erklärt p (muss mich in alles einlesen) Ich bin absoluter Beginner.

=class(aggr(
sum({< [KPI] = p([KPI AND]) >} [Value]) *
rangemax(1, -(count({< [KPI] = p([KPI AND]) >} distinct [KPI])=getselectedcount([KPI AND]))),
[Kategorie]), $(var))

[KPI] deinem Prüf-Feld entspricht und [KPI AND] aus einer Island-Table stammt
https://community.qlik.com/t5/QlikView-App-Dev/island-Table/td-p/1250731 ( Island-Table) 🙂


ID = Kunde
Produkt (rev) = Kategorie

KPI und KPI and ist mir noch nicht ganz klar

Was setzte ich für  -- ein 😞
$(var)        
KPI=  Prüf-Feld entspricht
KPI and (wie sieht sowas aus?) = Island-Table
Value

Puuuh, aller Anfang ist schwer

marcus_sommer

p() und e() sind spezielle Set Analysis Funktionen, die die möglichen bzw. ausgeschlossen Feld-Werte des jeweiligen Feldes zurückgeben. Standalone werden sie eher selten eingesetzt, denn hier entsprechen sie weitgehend dem Auswahl-Status und wären so eine redundante Anweisung. In Kombination mit weiteren Bedingungen und/oder Identifier und/oder auch mit eigener Set Analysis verschachtelt, sind sie jedoch sehr mächtig - und trotzdem einfach zu nutzen.

In dem Beispiel oben, wird sie genutzt, um die Auswahlen von zwei Feldern zu synchronisieren - zum Einen (linke Seite) das normale Feld aus dem Datenmodell und auf der rechte Seite wird die Selektion des extra generierten Navigations-Feldes abgefragt. Übertragen auf Deine Felder wäre das dann:

=class(aggr(
   sum({< [Produkt (rev)] = p([Produkt (rev) X]) >} [Value]) *
   rangemax(1, -(count({< [Produkt (rev)] = p([Produkt (rev) X]) >} distinct [Produkt (rev)])
                                 =getselectedcount([Produkt (rev) X]))),

[Kunde]), $(var))

Diese Navigations-Feld könnte per Inline-Tabelle oder von Extern (die Produkt-Stammdaten-Tabelle o.ä.) geladen werden, aber auch von den bereits geladenen Daten abgeleitet werden, z.B. per:

[IslandTable]: load fieldvalue('Produkt (rev)', recno()) as [Produkt (rev) X]
autogenerate fieldvaluecount('Produkt (rev)');

am Ende des Load-Scripts. $(var) ist ein Platzhalter für eine beliebige numerische Variable - lass sie erstmal weg und setze hier einfach manuell 100 ein.