簡體   English   中英

SQL:GROUPING SETS和PIVOT的替代和替代

[英]SQL: alternatives and substitutions for GROUPING SETS and PIVOT

我有這樣的代碼:

SELECT id, YEAR(datek) AS YEAR, COUNT(*) AS NUM
FROM Orders
GROUP BY GROUPING SETS
(
    (id, YEAR(datek)),
    id,
    YEAR(datek),
    ()
);

它給了我這個輸出:

1   NULL    4
2   NULL    11
3   NULL    6
NULL    NULL    21
1   2006    36
2   2006    56
3   2006    51
NULL    2006    143
1   2007    130
2   2007    143
3   2007    125
NULL    2007    398
1   2008    79
2   2008    116
3   2008    73
NULL    2008    268
NULL    NULL    830
1   NULL    249
2   NULL    326
3   NULL    255

我需要做的是編寫沒有“分組集”(也不是多維數據集或匯總)但結果相同的代碼。 我考慮過編寫三個不同的查詢,然后將它們與“聯合”一起加入。 我在分組設置中嘗試了類似“ null”的操作,但是它不起作用。

SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, YEAR(datek)
UNION
SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, null
order by id, YEAR(datek)

我也有一個關於“ PIVOT”的問題。 什么樣的語法可以用“ PIVOT”代替查詢?

感謝您的時間和所有答案!

正確的是,盡管實際上需要4個查詢,但您需要單獨的查詢,而不是GROUP BY NULL ,僅按相應分組集中的列進行分組,然后將SELECT的列替換為NULL

SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, YEAR(datek)

UNION ALL

SELECT id, NULL, COUNT(*) AS NUM
FROM Orders
GROUP BY id

UNION ALL

SELECT NULL, YEAR(datek), COUNT(*) AS NUM
FROM Orders
GROUP BY YEAR(datek)

UNION ALL

SELECT NULL, NULL, COUNT(*) AS NUM
FROM Orders
ORDER BY ID, Rok

關於替代PIVOT我認為最好的替代方法是使用條件聚合,例如:

SELECT  pvt.SomeGroup,
        pvt.[A],
        pvt.[B],
        pvt.[C]
FROM    T
        PIVOT (SUM(Val) FOR Col IN ([A], [B], [C])) AS pvt;

您將使用:

SELECT  T.SomeGroup,
        [A] = SUM(CASE WHEN T.Col = 'A' THEN T.Val ELSE 0 END),
        [B] = SUM(CASE WHEN T.Col = 'B' THEN T.Val ELSE 0 END),
        [C] = SUM(CASE WHEN T.Col = 'C' THEN T.Val ELSE 0 END)
FROM    T
GROUP BY T.SomeGroup;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM