如何获取Power BI矩阵行中的总数

时间:2020-08-28 19:13:15

标签: powerbi data-visualization dax

以下是Power BI表中的原始数据示例。 enter image description here

我想按Col B和Col C对Col D组的数目求和,并在矩阵行中将它们列出为合计数目。我怎样才能得到这样的欲望布局?看起来很简单,但无法弄清楚。 预先谢谢您enter image description here

忘记提及C列比所列出的更多。因此,总和将与外面的切片器一起使用。

1 个答案:

答案 0 :(得分:0)

您可以将计算出的列添加到表中,并在矩阵的行列表中使用它:

# coding:utf-8
# version 3.x python
import sys
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox                              # Librairie des fenêtres d'alerte

# ================= ID python ============================
print("TkVersion", TkVersion)
print("TclVersion", TclVersion)
print("Python version", sys.version_info)
import sys; print('Python %s on %s' % (sys.version, sys.platform))

# ================= Liaison file py =========================
import HV_DB_BackEnd

class Main:
    def __init__(self, root):
        self.root = root
        self.root.title("--------------")
        self.root.geometry("700x660+0+0")
        self.root.config(bg="cadet blue")

  if __name__ == '__main__':
    root = Tk()
    application = Main(root)

    # --- Déclaration Variables - Tableaux
    frames = []                     # Liste Frames
    global Liste_Full
    Liste_Full = []                  # Liste d'imbrication des L_List (sélection faites depuis Treeview)


    # ========================  Frame Treeview  ====================
    MainFrame = LabelFrame(root, text="[TEST]", relief=FLAT)
    MainFrame.place(x=5, y=5, width=1300, height=700)
    # =============  Frame hébergeant les sous frame  ==============
    FrameCalc_1 = Frame(name='labels')  #, relief=SOLID, borderwidth=1)
    FrameCalc_1.place(x=15, y=300, width=800, height=300)

    # ========================  Fonctions  ========================
    # [Treeview - Heading] - Empêche le redimensionnement des entêtes
    def handle_click(event):
        if HElist.identify_region(event.x, event.y) == "separator":
            if HElist.identify_column(event.x) == '#1':
                return "break"
            if HElist.identify_column(event.x) == '#2':
                return "break"
            if HElist.identify_column(event.x) == '#3':
                return "break"
            if HElist.identify_column(event.x) == '#4':
                return "break"
            if HElist.identify_column(event.x) == '#5':
                return "break"
            if HElist.identify_column(event.x) == '#6':
                return "break"

    # [TreeView widgets] - Affiche Table
    def DisplayData():
        # Insertion Table BD dans TreeView
        a = 0
        for i in HV_DB_BackEnd.loadRecord():
            HElist.insert('', 'end', text=i[0], values=(i[0], i[1], i[2], i[3], i[4], i[5]))
            # print("Index", i[0])
            a = a + 1
        print(" - Nombre d'enregistrement _ lecture Table", a)
        print(" - Nombre d'enregistrement _ lecture Treeview", len(HElist.get_children()))

    # Suppression frame(s) générés dynamiquement & MàJ Liste_Full
    def removeLabel(frame, var):
        print("frames avant suppression", frames)
        print("\n", "len(frames) avant", len(frames))
        frame.destroy()
        Liste_Full.__delitem__(var.get())

        ix = frames.index(var)          # lit l'indexation de la frame
        print("ix - Index de la frame à supprimer ", ix)
        frames.pop(ix)
        print("frames après suppression", frames)
        # Mise à jour de l'indexation var des frame
        # for i, v in enumerate(frames[ix:], start=ix):
        for i, v in enumerate(frames[0:], start=0):
            print("i", i)
            v.set(i)
            # print("v", i, v.get())
            # var.set(v.get())
        print("len(frames) après", len(frames))
        print("frames restantes", frames)


    # Création dynamiquement frame(s) contenant Labels selon la sélection faite depuis TreeView
    def selectItem(frame):
        var = IntVar()
        global frames

        frame = Frame(FrameCalc_1, borderwidth=0)                                                                    # frame à générer dans la frame master FramCalc_1
        frame.configure(relief=GROOVE)
        frame.grid(row=len(frames) + 1, column=5, pady=1)                                       # Nb de Colonne à générer - pady=intervale entre la prochaine
        frame.columnconfigure(0, minsize=135)                                                      # Largeur de la Colonne
        frame.columnconfigure(1, minsize=30)
        frame.columnconfigure(2, minsize=30)
        frame.columnconfigure(3, minsize=50)
        frame.columnconfigure(4, minsize=30)
        frame.columnconfigure(5, minsize=80)
        frame.columnconfigure(6, minsize=0)


        # === [Listing Table dans Widget Treeview] ===
        curItem = HElist.focus()
        Liste = HElist.item(curItem)["values"]


        # === [Génére automatiquement de nouveaux widgets Labels] ===

        var.set(len(frames))      # Compte le nombre de frame
        print(var.get())
        if var.get() < 5:
            print("\n" + "var.get()", var.get())
            L_Line = []                                                                                           # Liste temporaire pour chaque sélection
            # -- Génère Label - Affiche le Nb de Frame généré
            Label(frame,  textvariable=var).grid(row=0, column=0)
            # print("frame.winfo_children()[0] - Label compteur", frame.winfo_children()[0])        # .labels.!frame.!label

            frames.append(var)  # liste des frames générée
            # print("frames", frames)
            # print("nombre de frames générée-addNewLabel", len(frames))

            # -- Génére widget Label - Nom
            if Liste[0] != "":
                Label(frame,  text=Liste[1]).grid(row=0, column=1)
                L_Line.append(Liste[1])

            # -- Génére widget Label
            if Liste[0] != "":
                Label(frame,  text=Liste[3]).grid(row=0, column=2)
                L_Line.append(Liste[3])

            # -- Génére widget Label
            if Liste[0] != "":
                Label(frame,  text=Liste[5]).grid(row=0, column=3)
                L_Line.append(Liste[5])

            # -- Génére widget Entry
            if Liste[0] != "":
                    Input_gr = ""
                    # takefocus=True  autorise la tabulation via la touche TAB
                    l=Entry(frame,  width=4, text="", takefocus=True)
                    l.grid(row=0, column=4)
                    # print("frame.winfo_children()[3]            ", frame.winfo_children()[3])
                    Input_gr = frame.winfo_children()[3]
                    L_Line.append(Liste[0])

            # -- Génére Label -
            if Liste[0] != "":
                    lb_pourcentage = ""
                    Label(frame, text="").grid(row=0, column=5)
                    lb_pourcentage = frame.winfo_children()[4]                                    # Récupère le nom du label
                    # print("frame.winfo_children()[4]            ", frame.winfo_children()[4])
                    L_Line.append(Liste[0])

            # -- Génére widget Button
            # takefocus=False  supprime la tabulation via la touche TAB
            b = Button(frame, text="Supprimer", width=10, takefocus=False, command=lambda: removeLabel(frame, var))
            b.grid(row=0, column=5)
            # print("frame.winfo_children()[5] - Button Supprimer", frame.winfo_children()[5])      # .labels.!frame.!button
            # print("")

            # print("frame.winfo_children()", frame.winfo_children())
            Liste_Full.append(L_Line[0:len(L_Line)])                                                  # Imbrique L_Line dans Liste_Full
            print("Liste_Full", Liste_Full)                                                                    # exemple  [['test_14', 53, '0.142', 38, 38], ['test_0', 92, '0.138', 9, 9]]
            print("frames add", frames)


    # ============= Style Police : Treeview_Button_Label  ==============

    style = Style()
        # Treeview
    style.configure('.', foreground="black")                # Configuration TxT de la Frame contenant Treeview
    style.configure('TTreeview', rowheight=15, font=('verdana', 8, ''), foreground='white', background='dim gray')
    style.configure('TTreeview.Heading', font=('verdana', 8, ''), foreground="black", cursor='none')
    style.layout('TTreeview', [])

    # ===== Treeview & Scrollbar Vertical/Horizontal [XY] 
    scrollbar_y = Scrollbar(MainFrame, orient='vertical')  # Ascenseur Vertical
    scrollbar_y.place(x=1236, y=24, height=169)
    scrollbar_x = Scrollbar(MainFrame, orient='horizontal')  # Ascenseur Horizontal
    scrollbar_x.place(x=1, y=177, width=1236)

    HElist = Treeview(MainFrame, selectmode="browse", columns=(1,2,3,4,5,6), show="headings")  #, yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)  # style='TTreeview'
    # En-tête
    HElist.heading('#1', text="ID")
    HElist.heading('#2', text="Nom")
    HElist.heading('#3', text="C0")
    HElist.heading('#4', text="C1")
    HElist.heading('#5', text="C2")
    HElist.heading('#6', text="C3")

    HElist.column('#1', width=0, minwidth=0, stretch=False)
    HElist.column('#2', width=160, minwidth=160, stretch=OFF)
    HElist.column('#3', width=50, minwidth=50, anchor=CENTER, stretch=OFF)
    HElist.column('#4', width=57, minwidth=57, anchor=CENTER, stretch=OFF)
    HElist.column('#5', width=120, minwidth=120, stretch=OFF)
    HElist.column('#6', width=200, minwidth=200, stretch=OFF)

    HElist.place(x=2, y=2, width=1236, height=175)
    # Cache colonne(s)
    exclusionlist = ['1']                                                   # Colonne [ID] exclue d'affichage
    displaycolumns = ['2', '3', '4', '5', '6']                          # Colonne [xxx] affichées
    for col in HElist["columns"]:
        if not "%s" % col in exclusionlist:
            pass
    HElist["displaycolumns"] = displaycolumns

    scrollbar_y.config(command=HElist.yview)                # Ascenseur Vertical
    scrollbar_x.config(command=HElist.xview)                # Ascenseur Horizontal

    DisplayData()
    # Affiche Entry widget, via souris, la sélection des Datas [Colonnes Treeview]
    HElist.bind('<ButtonRelease-1>',  selectItem)            # Le bouton de la souris a été relâché

    # Désactive le redimensionnement des Entêtes Treeview
    HElist.bind('<Button-1>', handle_click)                 # Gauche
    HElist.bind('<Button-2>', handle_click)                 # Molette
    HElist.bind('<Button-3>', handle_click)                 # Droite

    root.mainloop()