簡體   English   中英

如何在group by子句的一個列中計算多個列和多個不同的值

[英]How do I count multiple columns and mutiple distinct values in one column in a group by clause

我正在根據拖車的長度,門的類型和位置對拖車進行匯總。 然后對按門口長度類型分組的記錄進行計數,然后上一層並按按門口長度類型分組的拖車進行計數。 最后,按批次位置計算拖車總數。

我已經試過這個例子。

http://sqlfiddle.com/#!9/23c89e/55

另外,我正在努力使分組和總計正確。 這確實可以正確計算拖車的長度(按門類型)-按批次位置。 但是,我無法進一步解決該問題。

這是select語句,使我走到了這一步。

SELECT g.length, g.doortype, g.location, g.total_location
FROM 
       ( SELECT length, doortype, location,  COUNT(*) AS total_location
         FROM trailers
         GROUP BY length, doortype, location
       ) AS g 

作為輸出示例,它可以正確地按長度,門類型和位置進行計數,但是沒有正確格式化和總計。

| length | doortype | location | total_location |
|--------|----------|----------|----------------|
|   28FT |  ROLL UP |    LOT C |              1 |
|   28FT |  ROLL UP |    LOT D |              2 |
|   28FT |    SWING |    LOT B |              1 |
|   45FT |  ROLL UP |    LOT B |              3 |
|   45FT |    SWING |    LOT B |              1 |
|   48FT |  ROLL UP |    LOT D |              1 |
|   48FT |  ROLL UP |    LOT E |              1 |
|   48FT |    SWING |    LOT A |              6 |
|   48FT |    SWING |    LOT B |              2 |
|   48FT |    SWING |    LOT C |              4 |
|   48FT |    SWING |    LOT E |              2 |

我正在嘗試使輸出看起來像這樣。

| length | doortype | lot a | lot b | lot c | lot d | trailer total|
|--------|----------|-------|-------|-------|-------|--------------|
|   28FT |  ROLL UP |   1   |   0   |   1   |   0   |       2      |
|   28FT |  SWING   |   0   |   0   |   1   |   0   |       1      |
|   45FT |  ROLL UP |   1   |   5   |   0   |   0   |       6      |
|   45FT |  SWING   |   0   |   0   |   0   |   4   |       4      |
|   48FT |  ROLL UP |   2   |   1   |   0   |   1   |       4      |
|   48FT |  SWING   |   0   |   0   |   1   |   1   |       2      |
|------------------------------------------------------------------|
            TOTAL   |   4   |   6   |   3   |   6   |       19     |

使用位置作為過濾器,並使用總和來合並其計數。

SELECT 
    length, 
    doortype, 
    SUM(IF(location = 'LOT A', 1, 0)) Lot_A,
    SUM(IF(location = 'LOT B', 1, 0)) Lot_B,
    SUM(IF(location = 'LOT C', 1, 0)) Lot_C,
    SUM(IF(location = 'LOT D', 1, 0)) Lot_D,
    COUNT(0) AS Trailer_Total
FROM trailers
GROUP BY length, doortype;

它將創建一些額外的門類型為NULL的行,您可以在循環瀏覽時忽略該行

            SELECT tab.*
            FROM (SELECT 
                COALESCE(length, 'All length') AS length,
                doortype, 
                SUM(IF(location = 'LOT A', 1, 0)) Lot_A,
                SUM(IF(location = 'LOT B', 1, 0)) Lot_B,
                SUM(IF(location = 'LOT C', 1, 0)) Lot_C,
                SUM(IF(location = 'LOT D', 1, 0)) Lot_D,
                COUNT(case location when 'LOT E' then null ELSE 1 end) AS Trailer_Total    
            FROM trailers
            GROUP BY length, doortype WITH ROLLUP
            )tab
            where tab.doortype IS NOT NULL OR tab.length = 'All length'
            order by tab.length, tab.doortype

暫無
暫無

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

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