Excel - hlasování



Ahoj,nemohu přijít jak nastavit Excel 365 aby dělal toto:Mám tabulku kde první sloupec v řádku je datum a další sloupce slouží k hlasování o datumu pro jednotlivé osoby ve variantě ano/nevím/ne/pokud je potřeba. Čili datum tomáš kuba martin pepa tonda výsledek11.11. ne ano ne ano ne ?A potřeboval bych nějak nastavit aby se v posledním sloupci "výsledek" zohlednilo hlasování jednotlivých lidí. Asi takto -tomáš a kuba musí mít ano/pokud je třeba a zároveň alespoň dva ostatní mají taktéž ano/pokud je třeba. Pokud je splněno tak bude výslek ano, v opačném případě ne. Barvy jsi už pak nějak dodělám :)Díky Martin
Barvy JSI už pak nějak doděláš? Takže ve škole se ještě pracovat s Excelem asi neučíte.
<p>sloupec můžete třídit do sestupného formátu a poté pouze získat hodnotu z n-tého řádku.</p><p>upravit::</p><p>aktualizováno podle požadavku na komentář.<strong> <em>upozorněn&iacute;</em> </strong>zcela nevyzkoušené!</p><pre><code>select dob from (select dob from users order by dob desc) where rowid = 6 </code></pre><p>něco takového by mělo fungovat pro oracle ... možná budete muset nejprve dostat syntaxi!</p> <p>tradičně je "seřadit podle" označeno pomocí šipek nahoru/dolů, které představují třídění vzestupně nebo sestupně. názvy sloupců by měly mít vyšší úroveň kontrastu než hodnoty, například odvážnější text nebo stínované pozadí.</p><p>osobně při obarvení střídavých řádků obvykle přecházím na světlejší než na tmavší, protože efekt se zvyšuje tím výrazněji, čím déle vaši uživatelé interagují s tabulkou.</p><p>zde je několik skvělých příkladů možností rozvržení tabulky: <a href="http://patterntap.com/tap/collection/tables">http://patterntap.com/tap/collection/tables</a> </p> <p>přiznávám, že jsem to nikdy předtím neudělal, takže došlo k trochu poškrábání hlavy. jednoduchá ukázková tabulka, která demonstruje:</p><pre><code>if exists (select * from sys.objects where object\_id = object\_id(n'[dbo].[mytable]') and type in (n'u')) drop table [dbo].[mytable] go create table dbo.mytable ( col1 int , col2 char(1) ) go insert dbo.mytable (col1, col2) values (1, 'a') insert dbo.mytable (col1, col2) values (1, 'b') insert dbo.mytable (col1, col2) values (1, 'c') insert dbo.mytable (col1, col2) values (2, 'a') insert dbo.mytable (col1, col2) values (2, 'b') insert dbo.mytable (col1, col2) values (2, 'c') insert dbo.mytable (col1, col2) values (3, 'a') insert dbo.mytable (col1, col2) values (3, 'b') insert dbo.mytable (col1, col2) values (3, 'c') </code></pre><p>pomocí parametru @sortstyle k rozlišení objednávek řazení se @sortstyle = 1 třídí podle <code>col1 asc, col2 desc</code> a @ sortstyle = 2 seřadit podle <code>col2 desc, col1 asc</code>.</p><pre><code>declare @sortstyle int set @sortstyle = 1 select col1 , col2 from dbo.mytable order by case when @sortstyle = 1 then col1 end asc, case when @sortstyle = 1 then col2 end desc, case when @sortstyle = 2 then col2 end desc, case when @sortstyle = 2 then col1 end asc set @sortstyle = 2 select col1 , col2 from dbo.mytable order by case when @sortstyle = 1 then col1 end asc, case when @sortstyle = 1 then col2 end desc, case when @sortstyle = 2 then col2 end desc, case when @sortstyle = 2 then col1 end asc </code></pre><p> <a href="https://dba.stackexchange.com/questions/4104/how-do-you-order-by-a-parameter/4111#4111">jak se objednáváte parametrem</a> pokrývá jednodušší případ třídění podle 1 sloupce.</p> <p>v tomto pořadí: b (s podrobným popisem manipulace níže), a (vyhláskováno), c.</p><p>c je pro mě „typické technické řešení“: nejprve se rozhodnete, jak specifikovat dobu trvání, poté určíte data potřebná pro tento algoritmus. spravovat je však pouze dva další ovládací prvky a uživatelé neznají možnosti, které mají před sebou. to znamená, že pokud jsou vaši uživatelé technici/analytičtí myslitelé a je nejjednodušší je implementovat, jděte na to.</p><p>b by bylo vhodnější:</p><p><img src="https://i.stack.imgur.com/fl7eg.png" alt="enter image description here"></p><p>minimální požadavky:</p><ul> <li>ovládání „předvolby“ a ovládání data a času jsou vždy k dispozici (nikdy zakázáno)</li> <li>změnou předvolby se změní čas zobrazený v ovládacích prvcích rozsahu</li> <li>změnou ovládacích prvků rozsahu se změní předvolba na „ostatní“</li> </ul><p>téměř perfektní:</p><ul> <li>porovnejte ruční výběr s vašimi předvolbami a zobrazte „jiné“ pouze v případě, že neexistuje žádná shoda</li> <li>když uživatel ručně vybere „jiné“, zobrazí se nápověda jako „zde vyberte začátek a konec data“</li> </ul><p>výhody:</p><ul> <li>uživatelé s nejasnou představou o vaší aplikaci mají řadu typických možností</li> <li>uživatelé získají okamžitou a konkrétní zpětnou vazbu pro svůj výběr</li> <li>výběr může být upřesněn, např. „další 3 týdny“ lze snadno upravit na „4 týdny“</li> </ul><p>varianty:</p><ul> <li>místo „jiných“ generujte vhodné textové reprezentace (např. „příštích 17 dní“).</li> <li>pokud je aplikace používána většinou běžnými častými uživateli (málo příležitostných uživatelů), zvažte bezplatné zadávání textu, jako je hisham, doporučeno: kliknout a zadat tři časy v daném dni je v pořádku, pro zadávání 30 za hodinu je bolest a volný text vyhraje.<br> (nedokážu si představit jednoduché kombinované rozhraní, které nějakým způsobem neznevýhodňuje začínající uživatele, ale pokud očekáváte širokou škálu uživatelů, možná budete muset za to zvážit některá řešení)</li> </ul><p>poznámky k rozvržení:</p><ul> <li>vynechal bych „z“ čistě pro čistý vzhled, ale je tu kompromis. obecně se snažím dát ovládacím prvkům stejnou velikost a postavit je na několik řádků, abych se vyhnul vzhledu „neklidného tvaru“.</li> <li>seskupte předvolby skupiny a výběr data společně (tj. jim poskytněte určitou vzdálenost od ostatních výběrů)</li> <li>"trvání" je samozřejmě hloupý štítek, promiň;)</li> </ul><hr><p>(vedlejší poznámka: instinktivně bych předpokládal interval sedmi dnů, abych odešel „od 17. února, 0:00 do 23. února, 23: 59: 59,9999 ..“, ale nejsem si jistý, jestli je tento univerzální.)</p> <p>x11 má několik dostupných schránek. ve výchozím nastavení <code>xclip</code> umisťuje data do vyrovnávací paměti primárního výběru. chcete-li jej vložit, použijte prostřední kliknutí.</p><p>pokud chcete použít <kbd>ctrl</kbd>+<kbd>v</kbd>, použijte <code>xclip -selection clipboard</code>. viz <code>man xclip</code> pro více informací.</p><p> <a href="http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt">freedesktop.org</a> jsou dobré informace o různých schránkách.</p> <p>i když si myslím, že jste sloupec již vytvořili, v této odpovědi předpokládám, že tento sloupec dosud neexistuje. imo, jedinečný povinný sloupec by měl být přidán <em> nikdy</em> bez plánování, jak naplnit existující řádky první. proto poskytnu metody, jak toho dosáhnout, počínaje nulou.</p><hr><p>jak to uděláte, záleží na tom, co se podílí na naplnění hodnot.</p><p>po použití libovolné metody přidejte do sloupce jedinečné omezení, abyste zajistili integritu dat. u metod 1 a 2 to lze provést v rámci jednoho příkazu nebo v rámci uživatelské transakce (není zobrazeno) a mělo by být provedeno v rámci uživatelské transakce v metodě 3.</p><p>pravděpodobně existuje několik dalších nejasných způsobů, jak to udělat, ale myslím, že jsem se zabýval nejběžnějšími.</p><hr><p><strong> metoda 1: přidejte sloupec identity </strong></p><pre><code>alter table mytable add mycolumn int identity(1, 2) not null </code></pre><p>tím se naplní všechny řádky v tabulce celočíselnými hodnotami začínajícími počátečními hodnotami (1), zvyšujícími se o přírůstkovou hodnotu (2) pro každý řádek. věřím, že pořadí, ve kterém jsou hodnoty naplněny, není definováno (pokud musíte určit objednávku, použijte metodu 3).</p><hr><p><strong> metoda 2: vyplnění pomocí výchozího omezení </strong></p><pre><code>alter table mytable add mycolumn uniqueidentifier not null constraint df\_mytable\_mycolumn default (newsequentialid()) </code></pre><p>to provede atomicky tři věci: 1. přidejte sloupec, který nepovoluje hodnoty <code>null</code>; 2. vytvořte výchozí omezení pro sloupec; 3. vyplňte každý řádek v tabulce pomocí výchozího omezení.</p><p>i když tento příklad používá sloupec <code>uniqueidentifier</code>, funguje stejně dobře s jakýmkoli typem dat a výchozím omezením.</p><hr><p><strong> metoda 3: vyplnění pomocí příkazu update </strong></p><p>tento případ by nastal, když například existuje hodnota z jiné části aplikace, kterou je třeba přidat do tabulky, nebo je třeba zadat přesnou objednávku pro jedinečné hodnoty.</p><pre><code>begin transaction alter table mytable add mycolumn int null update mytable set mycolumn = ... alter table mytable alter column mycolumn int not null commit transaction </code></pre><hr><p><strong> metoda 4: vyplnění pomocí objektu sequence </strong></p><p>pro sql server 2012 můžete naplnit sloupec pomocí hodnot generovaných objektem <code>sequence</code> - s tím jsem ještě nepracoval, takže se budu odkazovat na <a href="http://msdn.microsoft.com/en-us/library/ff878058.aspx">článek msdn</a> pro úplnost.</p> <p>text by měl do značné míry záviset na samotném skutečném obsahu. je to citlivé na čas, jako jsou zprávy, nebo je to obsah, který bude relevantní bez ohledu na to, když se zobrazí? pokud je to citlivé na čas, má smysl používat starší/novější. pokud to není časově citlivé, předchozí/další se jeví lépe.</p><p>řekl bych však, že přidání čísel stránek by zvýšilo srozumitelnost vašeho stránkování, protože by vám poskytlo počáteční index, který je snadno patrný, a také by poskytlo více kontextu pro vaše stránkování. většina zmatku ve výše uvedených metodách vyplývá z toho, že nevíte, kde jste, nevíte, kde jste, nebo obojí. čísla stránek pomáhají tento problém zmírnit, zejména pokud jasně uvedete, které číslo stránky uživatel právě prohlíží.</p><p>pokud jde o to, co by mělo přijít první, starší/novější, záleží zcela na vašem pořadí řazení. znovu však přidávání čísel stránek do značné míry zmatek minimalizuje.</p><p>a co víc, jak pro účely použitelnosti, tak pro účely seo byste měli poskytnout více než jen starší/novější nebo další/předchozí.</p><p>zvážit:</p><p>předpokládejme, že váš blog se týká obchodních zpráv. který je nejužitečnější?</p><ol> <li><strong>novější obchodní zprávy</strong> 1 2 [3] 4 5 <strong>starší obchodní zprávy</strong></li> <li><strong>novější obchodní zprávy</strong> | <strong>starší obchodní zprávy</strong></li> <li><strong>novější</strong> 1 2 [3] 4 5 <strong>starší</strong></li> <li><strong>novější</strong> | <strong>starší</strong></li> </ol><p>nebo řekněme, že váš blog není časově citlivý. místo toho publikujete obchodní články, jako jsou osvědčené postupy týkající se marketingu, najímání, strategie atd. co je nejužitečnější?</p><ol> <li><strong>předchozí obchodní zdroje</strong> 1 2 [3] 4 5 <strong>další obchodní zdroje</strong></li> <li><strong>předchozí obchodní zdroje</strong> | <strong>další obchodní zdroje</strong></li> <li><strong>předchozí</strong> 1 2 [3] 4 5 <strong>další</strong></li> <li><strong>předchozí</strong> | <strong>další</strong></li> </ol> <p>pokud <em>mají</em> něco potvrdit, jedinou možností je modální dialog s tlačítkem ok/přijmout.</p><p>pokud musí s něčím souhlasit, mělo by existovat tlačítko storno.</p><p>ve skutečnosti by tlačítka měla obsahovat smysluplný text, nejen ok/storno.</p> <p>příkaz <code>merge</code> má složitou syntaxi a ještě složitější implementaci, ale v zásadě jde o spojení dvou tabulek, filtrování dolů na řádky, které je třeba změnit (vložit, aktualizovat nebo smazat), a poté provést požadované změny. vzhledem k těmto vzorovým údajům:</p><pre><code>declare @categoryitem as table ( categoryid integer not null, itemid integer not null, primary key (categoryid, itemid), unique (itemid, categoryid) ); declare @datasource as table ( categoryid integer not null, itemid integer not null primary key (categoryid, itemid) ); insert @categoryitem (categoryid, itemid) values (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 5), (3, 6), (4, 5); insert @datasource (categoryid, itemid) values (2, 2); </code></pre><p><strong> cíl </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 2 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 3 ║ ║ 3 ║ 5 ║ ║ 4 ║ 5 ║ ║ 3 ║ 6 ║ ╚════════════╩════════╝ </code></pre><p><strong> zdroj </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>požadovaným výsledkem je nahrazení dat v cíli daty ze zdroje, ale pouze pro <code>categoryid = 2</code>. po výše uvedeném popisu <code>merge</code> bychom měli napsat dotaz, který spojuje zdroj a cíl pouze na klíče, a filtrovat řádky pouze v klauzulích <code>when</code>:</p><pre><code>merge into @categoryitem as target using @datasource as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by source and target.categoryid = 2 then delete when not matched by target and source.categoryid = 2 then insert (categoryid, itemid) values (categoryid, itemid) output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>to dává následující výsledky:</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 2 ║ ║ 3 ║ 5 ║ ║ 3 ║ 6 ║ ║ 4 ║ 5 ║ ╚════════════╩════════╝ </code></pre><p>realizační plán je: <img src="https://i.stack.imgur.com/fovhu.jpg" alt="merge plan"></p><p>všimněte si, že jsou obě tabulky plně naskenovány. můžeme to považovat za neefektivní, protože pouze řádky, kde <code>categoryid = 2</code> bude ovlivněno v cílové tabulce. zde přicházejí varování v books online. jeden chybný pokus o optimalizaci, aby se dotkl pouze nezbytných řádků v cíli, je:</p><pre><code>merge into @categoryitem as target using ( select categoryid, itemid from @datasource as ds where categoryid = 2 ) as source on source.itemid = target.itemid and target.categoryid = 2 when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>logika v klauzuli <code>on</code> je použita jako součást spojení. v tomto případě je spojení úplným vnějším spojením (viz <a href="http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx">tento záznam books online</a> proč). použití kontroly kategorie 2 na cílových řádcích jako součásti vnějšího spojení nakonec povede k odstranění řádků s jinou hodnotou (protože neodpovídají zdroji):</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 1 ║ 1 ║ ║ delete ║ 1 ║ 2 ║ ║ delete ║ 1 ║ 3 ║ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ║ delete ║ 3 ║ 5 ║ ║ delete ║ 3 ║ 6 ║ ║ delete ║ 4 ║ 5 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>kořenová příčina je ze stejného důvodu, proč se predikáty chovají v klauzuli vnější spojení <code>on</code> odlišně, než když jsou specifikovány v klauzuli <code>where</code>. syntaxe <code>merge</code> (a implementace spojení v závislosti na zadaných klauzulích) jen ztěžují vidět, že tomu tak je.</p><p> <a href="http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx">navádění v books online</a> (rozšířeno v položce <a href="http://technet.microsoft.com/en-us/library/cc879317%28v=sql.105%29.aspx">optimizing performance</a> ) nabízí navádění, které zajistí, že správná sémantika je vyjádřena pomocí syntaxe <code>merge</code>, aniž by uživatel nutně musel muset pochopit všechny podrobnosti implementace nebo zohlednit způsoby, kterými by optimalizátor mohl legitimně přeskupit věci z důvodů efektivnosti provádění.</p><p>dokumentace nabízí tři možné způsoby implementace časného filtrování:</p><p><strong> zadání podmínky filtrování v klauzuli <code>when</code> </strong> zaručuje správné výsledky, ale může znamenat, že více řádků je čteno a zpracováno ze zdroje a cíle tabulky, než je nezbytně nutné (viz první příklad).</p><p><strong> aktualizace prostřednictvím zobrazení </strong>, která obsahuje podmínku filtrování, také zaručuje správné výsledky (protože změněné řádky musí být přístupné pro aktualizaci prostřednictvím zobrazení), ale vyžaduje to vyhrazené zobrazení, které splňuje liché podmínky pro aktualizaci zobrazení.</p><p><strong> použití společného výrazu tabulky </strong> přináší podobné riziko při přidávání predikátů k klauzuli <code>on</code>, ale z poněkud odlišných důvodů. v mnoha případech to bude bezpečné, ale vyžaduje to odbornou analýzu prováděcího plánu, aby se to potvrdilo (a rozsáhlé praktické testování). například:</p><pre><code>with target as ( select * from @categoryitem where categoryid = 2 ) merge into target using ( select categoryid, itemid from @datasource where categoryid = 2 ) as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>výsledkem jsou správné výsledky (neopakované) s optimálnějším plánem:</p><p><img src="https://i.stack.imgur.com/tazmk.jpg" alt="merge plan 2"></p><p>plán čte pouze řádky pro kategorii 2 z cílové tabulky. to může být důležitým hlediskem výkonu, pokud je cílová tabulka velká, ale je příliš snadné tuto chybu získat pomocí syntaxe <code>merge</code>.</p><p>někdy je snazší zapsat <code>merge</code> jako samostatné operace dml. tento přístup může dokonce <strong> vést lépe </strong> než jediný <code>merge</code>, což je skutečnost, která lidi často překvapuje.</p><pre><code>delete ci from @categoryitem as ci where ci.categoryid = 2 and not exists ( select 1 from @datasource as ds where ds.itemid = ci.itemid and ds.categoryid = ci.categoryid ); insert @categoryitem select ds.categoryid, ds.itemid from @datasource as ds where ds.categoryid = 2; </code></pre> <p><strong>žádné objednání není zmeškaná příležitost</strong></p><p>pokud máte „žádný příkaz“, je to zmeškaná příležitost usnadnit navigaci v seznamu. chronologické pořadí přidávání, nebo abecední pořadí, se může vylepšit pouze u „žádného definitivního pořadí“, pokud jde o navigaci. jakmile máte objednávku, máte odpověď na to, kam přidat.</p><p>předpokládám, že čas přidávání je pro vaši aplikaci užitečnější než abecední, nebo byste už používali abecedu a neměli byste mít otázku - takže máte na výběr mezi chronologickým nebo reverzním chronologem.</p><p><strong>chronologický nebo reverzní chronologický?</strong></p><p>je pravděpodobnější, že se uživatelé budou zajímat o starší nebo nově přidané záznamy? to může rozhodnout, zda je chronologické nebo obrácené chronologické pořadí přidávání správným řádem. dejte nejzajímavější na vrchol. pokud se preference může lišit, pak <strong>přidejte šipku řazení/nahor</strong>, aby si uživatel mohl vybrat. nyní máte opět definitivní pořadí a víte, kam přidat záznamy. pokud téměř nikdy není žádný zájem o starší nebo novější, takže se vyplatí přidat šipku řazení, pak se nové položky zobrazí na konci tabulky, která je nejblíže tlačítku odeslat. tímto způsobem, se zaměřením pozornosti na tlačítko, vidí změnu tak, jak se stane.</p><p><em> něco </em> poblíž <kbd>submit</kbd> tlačítko se musí po kliknutí změnit, např. počet záznamů, ne-li skutečný vzhled nové položky, takže v blízkosti tlačítka existuje nějaká vizuální zpětná vazba, že se něco stalo. tam hledají.</p>